課程:《程序設計與數據結構》
班級: 1723
姓名: 餘坤澎
學號:20172313
實驗教師:王志強
實驗日期:2018年11月20日
必修/選修: 必修html
//斐波那契查找 public int fbSearch(int[] array, int a) { if (array == null || array.length == 0) { return -1; } else { int length = array.length; int[] fb = makeFbArray(length + 2); int k = 0; while (length > fb[k] - 1) {// 找出數組的長度在斐波數列(減1)中的位置,將決定如何拆分 k++; } int[] temp = Arrays.copyOf(array, fb[k] - 1); for (int i = length; i < temp.length; i++) { if (i >= length) { temp[i] = array[length - 1]; } } int low = 0; int hight = array.length - 1; while (low <= hight) { int middle = low + fb[k - 1] - 1; if (temp[middle] > a) { hight = middle - 1; k = k - 1; } else if (temp[middle] < a) { low = middle + 1; k = k - 2; } else { if (middle <= hight) { return middle;// 此時mid即爲查找到的位置 } else { return hight;// 此時middle的值已經大於hight,進入擴展數組的填充部分,即最後一個數就是要查找的數。 } } } return -1; } } //生成一個指定長度的斐波數列 public int[] makeFbArray(int length) { int[] array = null; if (length > 2) { array = new int[length]; array[0] = 1; array[1] = 1; for (int i = 2; i < length; i++) { array[i] = array[i - 1] + array[i - 2]; } } return array; }
問題一解決方案:既然是斐波那契查找法,咱們首先須要知道斐波那契數列到底是什麼。java
斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲「兔子數列」,指的是這樣一個數列:一、一、二、三、五、八、1三、2一、3四、……在數學上,斐波納契數列以以下被以遞歸的方法定義:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)android
通俗的來說,就是從第3個數開始,每個數都等於它前面的兩個數的和,而斐波那契查找則正是利用了它的性質,前一個數除以相鄰的後一個數,比值無限接近黃金分割。如今假設咱們有這樣一個數列,它的長度爲9(數值任意),則它對應的斐波那契數列爲{1,1,2,3,5,8,13,21,34}(長度要大於等於9),大於9且最接近9的斐波那契數值是f[6]=13,爲了知足所謂的黃金分割,因此它的第一個拆分點應該就是f[6]的前一個值f[5]=8,即待查找數組array的第8個數,對應到下標就是array[7],依次類推。推演到通常狀況,假設有待查找數組array[n]和斐波那契數組F[k],而且n知足n>=F[k]-1&&n < F[k+1]-1,則它的第一個拆分點middle=F[k]-1。若是n恰好等於F[k]-1,待查找數組恰好拆成F[k-1]和F[k-2]兩部分;然而大多數狀況並不能盡人意,n會小於F[k]-1,這時候咱們須要使用補齊,用最大的數來填充F[k-2]的殘缺部分,若是查找的位置落到補齊的部分,那就能夠肯定要找的那個數就是最後一個最大的了。算法
此次實驗整體上來講難度不大,不少都是以前聯繫過的內容,在此次實驗中主要是複習了Juni測試,命令行使用以及androidstudio的使用。在此次實驗中仍是發現了本身的不足,沒有對以往的內容進行很好的複習。但願在此次認識到本身的不足後可以加以改正,在之後的學習生活中繼續進步。數組