1. 程式人生 > >Java資料結構:四種基本演算法(窮舉演算法,遞推演算法,分治演算法,概論演算法)

Java資料結構:四種基本演算法(窮舉演算法,遞推演算法,分治演算法,概論演算法)

1,窮舉演算法

主要解決雞兔同籠類似問題



public class 窮舉演算法 {
	public static void main(String[] args) {
		int head = 35;
		int foot = 94;
		int j = 0;
		int i = 0;
		int tuziNumber = 0;
		int gongjiNumber = 0;
		for (i = 0; i <= 35; i++) {
			j = head - i;
			if (i * 2 + j * 4 == 94) {
				tuziNumber = i;
				gongjiNumber = j;
			}
		}
		System.out.println("兔子數量" + tuziNumber + "\n公雞數量" + gongjiNumber);
	}
}

2,遞推演算法

主要解決兔子產仔問題:一對兩個月大的兔子以後每個月可以生一對兔子,如果一月份出生,則三月份可產仔,求一年後有多少對兔子

思想:1-1,2-1,3-2,4-3,5-5......Fn=Fn-2+Fn-1



public class 遞推演算法 {
	public static int Fibonacci(int n) {
		if (n == 1 || n == 2) {
			return 1;
		} else {
			return Fibonacci(n - 1) + Fibonacci(n - 2);
		}
	}
	public static void main(String[] args) {
		int n = 12;
		System.out.println("兔子在" + n + "天,共有" + Fibonacci(n) + "只");
	}
}

3,分治演算法

主要解決硬幣真假類問題

思想:將一分二,二分四。。。。。



import java.util.*;

public class 分治演算法 {
	static final int MAXNUM = 10;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int coint[] = new int[MAXNUM];
		for (int i = 0; i < n; i++) {
			coint[i] = sc.nextInt();
		}
		int weizhi=FalseCoin(coint,0,n-1);
		System.out.println("假幣為"+weizhi+"號硬幣");
	}

	static int FalseCoin(int coin[], int low, int high) {
		int i, sum1, sum2, sum3;
		int re = 0;
		sum1 = sum2 = sum3 = 0;
		if (low + 1 == high) { // 兩枚硬幣
			if (coin[low] < coin[high]) {
				re = low + 1;			//防止索引為0,改為1號硬幣
				return re;
			} else {
				re = high + 1;
				return re;
			}
		}
		if ((high - low + 1) % 2 == 0) { // 如果是偶數個硬幣
			for (i = low; i <= low + (high - low) / 2; i++) { // 前半段硬幣
				sum1 = sum1 + coin[i]; // 求和
			}
			for (i = low + (high - low) / 2 + 1; i <= high; i++) { // 後半段硬幣
				sum2 = sum2 + coin[i]; // 求和
			}
			if (sum1 > sum2) {
				re = FalseCoin(coin, low + (high - low) / 2 + 1, high); // 後半段質量小,取後半段繼續二分求
				return re;
			} else {
				re = FalseCoin(coin, low, low + (high - low) / 2); // 前半段質量小,取前半段繼續二分求
				return re;
			}
		} else { // 如果是奇數個硬幣
			for (i = low; i <= low + (high - low) / 2 - 1; i++) {
				sum1 = sum1 + coin[i];
			}
			for (i = low + (high - low) / 2 + 1; i <= high; i++) {
				sum2 = sum2 + coin[i];
			}
			if (sum1 > sum2) {
				re = FalseCoin(coin, low + (high - low) / 2 + 1, high); // 後半段質量小,取後半段繼續二分求
				return re;
			} else if (sum1 < sum2) {
				re = FalseCoin(coin, low, low + (high - low) / 2); // 前半段質量小,取前半段繼續二分求
				return re;
			}
			if (sum1 == sum2) { // 如果是最中間的那個是假幣
				re = low + (high - low) / 2 + 1;
				return re;
			}
		}
		return re;
	}
}

4,概論演算法

主要求解Π的問題

思想:向正方形中撒撒豆子,求落在圓內的豆子,在比上總豆子,得到Π



public class 概論演算法 {
	public static void main(String[] args) {
		int count = 10000000;
		int number = 0;
		double PI;
		for (int i = 1; i < count; i++) {
			double x = Math.random();
			double y = Math.random();
			if (x * x + y * y <= 1) {
				number++;
			}
		}
		PI = 4.0 *number / count;
		System.out.println("Π的值為" +  PI);
	}
}

相關推薦

Java資料結構基本演算法演算法演算法分治演算法概論演算法

1,窮舉演算法 主要解決雞兔同籠類似問題 public class 窮舉演算法 { public static void main(String[] args) { int head = 35; int foot = 94; int j = 0; i

Java資料結構單源最短路徑問題---Dijkstra演算法

嚶擊長空 如圖: 思路:先任意找一個根節點,然後開始迴圈找連線該點所有邊,然後找到權值最小的一項,標記被訪問,然後再次迴圈找除了根節點和被訪問過的結點的邊,找到權值最小的。具體開註釋,非常詳細喲。 上程式碼: public void shortesPath(int i) { in

Java資料結構最小生成樹---Prim演算法

日常更新資料結構 思想:通過選擇一個根結點,然後遍歷其所有的邊,選擇權重最小的一個邊。然後到達相應的結點,然後再從該邊出發,依舊選擇權重最小的邊到達下一個結點。(目的是為了使A到各個結點的權值和最小) 原圖為上述圖。 過程:A開始遍歷AB,AC,AD。發現AD權值最小,然後選擇AD

Java資料結構排序演算法氣泡排序選擇排序插入排序希爾排序快速排序堆排序和合並排序

public class 氣泡排序 { public static void main(String[] args) { int a[] = { 1, 9, 6, 8, 5, 65, 65, 84, 1, 2, 5, 23, 7, 889 }; for (int i

資料結構字串(堆)——基本操作

資料結構的重要行不言而喻,簡單介紹我在這部分遇到的一些問題,希望對大家有少許幫助。 首先實現的多個操作: 程式碼: #include<stdio.h> #include<stdlib.h> #include<string.h> #defi

Java資料結構複數運算大全

public class 複數運算 { void cPlus(double a, double b, double c, double d, double[] e, double[] f) {// 加法 e[0] = a + c; f[0] = b + d; }

Java資料結構割圓術求Π

利用割圓術,將一個圓分割成正多邊形,在利用多邊形邊長=圓周,求Π import java.util.*; public class 割圓術求Π { public static void main(String[] args) { int n; System.

Java資料結構牛頓迭代法求非線性方程的解

根據以上思想 public class 牛頓迭代法 { static double func(double x) { //待求解方程 return x * x * x * x - 3 * x * x * x + 1.5 * x * x - 4.0; } s

Java資料結構二叉排序樹的刪除操作

嚶嚶嚶,今天補回昨天沒有寫的部落格。 二叉排序樹的刪除操作比較簡單,但是思想很全面,因此本人就寫一篇部落格紀念一下。 思想:四種類型也可以是三種 1,刪除結點p的度為2,即有左右子樹。 此時有兩種方法,第一種將結點的左子樹在中根遍歷下的最後一個結點放到p的位置。第二種是將p結點

Java資料結構中根次序遍歷二叉排序樹

        昨天離開了創新創業基地,有點難受,雖然換來了高效,但是總覺的難受,一起度過了半年,昨天離開了。 說正事,今天更新二叉排序樹的中根遍歷。         思想:其實沒啥,類似與二叉樹的非遞迴中

Java資料結構圖的深度優先遍歷和廣度優先遍歷

更新啦,更新啦。 圖的深度優先遍歷:通過一個結點開始遍歷,直到遍歷到該結點沒有下一個結點為止,然後開始遞迴下一個結點,如果被訪問過,則跳過遍歷,依次類推。類似於一口氣到底,如果沒到底,則換個結點繼續到底。如果被訪問過的結點則不需要遍歷。 過程:A開始進入遞迴,A先列印。然後發現A的下一

Java資料結構前序和中序還原二叉樹

根據二叉樹前根中根遍歷出來的陣列還原二叉樹。 前根:ABDGCEFH           中跟:DGBAECHF 上程式碼: private BinaryNode<T> create(T[] prelist, T

Java資料結構二叉樹的層次遍歷

真香啊,前天還說日更部落格,昨天就真香了。 層次遍歷類似於二叉樹後根遍歷的非遞迴形式。依靠佇列輔助完成。 思路:從根節點開始,遇到結點則將它的子結點入隊,列印此結點後,再出隊一個結點,然後將該結點的子結點入隊。依次類推。 思路:從0開始,將1,2入隊,此時佇列中只有1,2然後列印0

Java資料結構二叉樹的前序中序後序遍歷迴和非

嚶嚶嚶,兩個月沒寫部落格了,由於有點忙,今天開始日更部落格。 今天總結一下學習樹的先根,中根,後根。每種兩種方法,遞迴和非遞迴。 先根: 遞迴: 思路:先根遍歷,即第一次遇到的結點就開始列印。先一直遍歷左子樹,直到未空,然後右子樹,直到為空。遞迴下去。 過程:先將1進入方法

Java魔法堂引用型別、ReferenceQueue和WeakHashMap

一、前言                               JDK1.2以前只提供一種引用型別——強引用 Object obj = new Object(); 。而JDK1.2後我們多另外的三個選擇分別是軟引用 java.lang.ref.SoftReference 、弱引用 java.lang.

Java資料結構求二叉樹一個結點的父母結點

類似於二叉樹的遍歷,引用結點的左右結點與待查結點進行比較 public BinaryNode<T> getParent(BinaryNode<T> node) { if (root==null || node==null || node==

Java資料結構二叉樹的遍歷

嚶嚶嚶,依舊是遞迴,從根節點開始分支左右樹,然後進入遞迴 上程式碼: public T search(T key) //查詢並返回首次出現的關鍵字為key元素 { return searchNode(root, k

Java資料結構N階魔方陣

思路:先隨便放置1,下一個元素放在1的上一行,下一列,其實沒必要非按照這個方法,可以是下一行下一列,都是一行一行的豎直加一或者減一 import java.util.Scanner; public class n階魔方陣 { private static void M

Java資料結構隨機生成正太分佈數

正態分佈數≈均值+方差*(x)  x:為隨機分佈-均值,詳情如下 public class 產生正太分佈的隨機生成數 { static double rand01(double[] r) { //生成0-1的隨機數 double base, u, v, p, t

資料結構字串的基本操作

字串(string)是由0個或多個字元組成的有限序列。一般使用順序儲存結構,末尾以’\0’表示結束,但不計入字串的長度。 示例程式:(改編自《大話資料結構》 #include<iostream> using namespace std;