在我印象的二分查找法中,对半查找法应该是效率最高的,但是今天我突然发现一个叫做“斐波那契查找法”的算法,这个算法竟然比对半查找法更有效率,以下是算法介绍和我的理解 斐波那契查找法实现代码:
- #include “stdafx.h”
- #include <memory>
- #include <iostream>
- using namespace std;
- const int max_size=20;//斐波那契数组的长度
- /*构造一个斐波那契数组*/
- void Fibonacci(int * F)
- {
- F[0]=0;
- F[1]=1;
- for(int i=2;i<max_size;++i)
- F[i]=F[i-1]+F[i-2];
- }
- /*定义斐波那契查找法*/
- int Fibonacci_Search(int *a, int n, int key) //a为要查找的数组,n为要查找的数组长度,key为要查找的关键字
- {
- int low=0;
- int high=n-1;
- int F[max_size];
- Fibonacci(F);//构造一个斐波那契数组F
- int k=0;
- while(n>F[k]-1)//计算n位于斐波那契数列的位置
- ++k;
- int * temp;//将数组a扩展到F[k]-1的长度
- temp=new int [F[k]-1];
- memcpy(temp,a,n*sizeof(int));
- for(int i=n;i<F[k]-1;++i)
- temp[i]=a[n-1];
- while(low<=high)
- {
- int mid=low+F[k-1]-1;
- if(key<temp[mid])
- {
- high=mid-1;
- k-=1;
- }
- else if(key>temp[mid])
- {
- low=mid+1;
- k-=2;
- }
- else
- {
- if(mid<n)
- return mid; //若相等则说明mid即为查找到的位置
- else
- return n-1; //若mid>=n则说明是扩展的数值,返回n-1
- }
- }
- delete [] temp;
- return -1;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- int a[] = {0,16,24,35,47,59,62,73,88,99};
- int key=100;
- int index=Fibonacci_Search(a,sizeof(a)/sizeof(int),key);
- cout<<key<<” is located at:”<<index;
- system(“PAUSE”);
- return 0;
- }
(代码参考于:http://blog.csdn.net/yunzhongguwu005/article/details/9341761)
而对半查找的常用形式: while(low<=high) { m=(low+high)/2; if(x<l[m]) { high=m-1; } else if (x>l[m])low=m+1; else { x=l[m]; return Success; } } 首先
斐波那契二分查找法和对半查找法的时间复杂度都是O(log(n)),且
对半查找法我们从信息论的信息熵的相关知识能看出,
对半查找法在执行步数上仍然比
斐波那契二分查找法更少 但是从以上我们也能发现,斐波那契二分查找法在核心算法上,只有赋值与减法运算,对半查找法却有除法运算,所以这应该就是它的优势所在吧。