在介绍裴波那契查找算法之前,我们先介绍一下很它紧密相连并且大家都熟知的一个概念一黄金分割。
黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约为1:0.618或1.618:1.
0.61B被公认为最具有审美意义的比例数字,这个数值的作用不仅仅体现在诸如绘画、雕塑、音乐、建筑等艺术领域,而且在管理、工程设计等方面也有着不可忽视的作用。因此被称为黄金分割。
在数学中有一个非常有名的数学规律:斐波那契数列:1,1,2,3,5,8,13,21,34,55,
89......
(从第三个数开始,后边每一个数都是前两个数的和).
然后我们会发现,随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618,利用这个特性,我们就可以将黄金比例运用到查找技术中。
基本思想:也是二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率。同样地,斐波那契查找也属于一种有序查找算法。
斐波那契查找也是在二分查找的基础上进行了优化,优化中间点mid的计算方式即可代码示例:‘java
public class FeiBoSearchDemo {
public static int maxsize = 20,
public static void main(string[] args) {
int[] arr = (1, 8,10,89,1000,1234}1 system.out,println(search (arr,1234))1 public static int[]getFeiBo() {
int[] arr - new int[maxsize]; arr[0]- 1; arr[1] = 11
for (int i - 2; 1 < maxsize; i++) {
arr(i] = arr[i - 1] + arr[i - 2]1
return arr,
public static int search (int[] arr, int key){
int low = 01
int high = arr,length - 11//表示斐波那契数分割数的下标值 int index 0; int mid = 01//调用斐波那契数列
int[]f = getFeiBo()1//获取斐波那契分割数值的下标
while (hign>(f[index] - l》 {
index++1
//因为f[k]值可能大于a的长度,因此需要使用Arrays工具类,构造一个新法数组,并指向
temp[],不足的部分会使用0补齐
int[] temp - Arrays.copyof (arr, f[index]);//实际需要使用arr数组的最后一个数来填充不足的部分
for (int i - nigh + 1; i < temp.length; i++){
temp[i]= arr[high)1
//使用while循环处理,找到key值 while (low <- high){
mid = low + f[index - 1]-11
if (key < temp[mid]){//向数组的前面部分进行查找
high - mid - l;/2
对k--进行理解
1,全部元素=前面的元素+后面的元素
2.f[k]=k[k-1]+f[k-2]
因为前面有k-1个元素没所以可以继续分为f[k-1]-f[k-2]+f[k-3]即在f[k-1]的前面继续查找K--即下次循环,mid=f[k-1-1]-1
index--;
} else if (key > temp[mid]){//向数组的后面的部分进行查找
low = mid + l; index -= 21} else {//找到了
//需要确定返回的是哪个下标 ir (mid <- high) {
return midi} else
return high;}
}
return -l,