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;