课程:《程序设计与数据结构》
班级: 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的使用。在此次实验中仍是发现了本身的不足,没有对以往的内容进行很好的复习。但愿在此次认识到本身的不足后可以加以改正,在之后的学习生活中继续进步。数组