1. 适用范围:
- 比折半查找和插值查找更快
- 数据顺序排列
2. 算法思想:
- 属于折半查找的变种
- 按黄金分割比来划分区域
- 用斐波那契数列获得黄金分割比
- 不用0.618的原因: 构造斐波那契数列只用加法, 更快
- 具体划分方法:
- 分为两部分, 前面为较大的斐波那契数, 后面为较小的
- 两者相加正好等于较大的斐波那契数的下一个数
- 分为两部分, 前面为较大的斐波那契数, 后面为较小的
- 用斐波那契数列获得黄金分割比
- 按黄金分割比来划分区域
3. 在c语言中的实现
描述:
- 构造斐波那契数列时要预留两个1,
- 让首尾阶段也能够一个一个查找, 即使没有黄金分割比
- 首位阶段就两种情况不能使用黄金分割比
- 即总长为2或1
- 首位阶段就两种情况不能使用黄金分割比
- 让首尾阶段也能够一个一个查找, 即使没有黄金分割比
- 先把原始数据长度填充到最接近的斐波那契数
- 分割区域只要用前一个斐波那契数来分前面部分即可
- 后面的自然就分出来了
- 当斐波那契数列用完的时候, 就已经全部查找过了
- 更新区域的时候要顺便把当前长度更新为新的斐波那契数 代码:
int fibonacciSearch(int data[],int length, int maxsize,int targetValue){
//length为data[]实际数据长度,maxsize为data[]最大长度
int fiboIndex;
/*构建斐波那契数列*/
int *fiboArray=(int*)calloc(maxsize,sizeof(int));
fiboArray[0]=1;//给Index=1的时候用,且为最后用到的索引
fiboArray[1]=1;//给Index=2的时候用,且为最后用到的索引
fiboArray[2]=1; fiboArray[3]=2;
for(int i=4;fiboArray[i-1]<=maxsize;++i){
fiboArray[i]=fiboArray[i-1]+fiboArray[i-2];
}
/*找到最接近的斐波那契数*/
for(fiboIndex=0;fiboArray[fiboIndex]<length;++fiboIndex);
/*填充数据到斐波那契数长度*/
for(int i=length+1;i<=fiboArray[fiboIndex];++i){
data[i]=data[length];
}
/*查找*/
int left=1,mid;
for(;fiboIndex>0;){
mid=left-1 + fiboArray[fiboIndex-1];
if(data[mid]==targetValue){
free(fiboArray);
/*辨别是否后面填充的数据*/
if(mid>length)return length;
return mid;
}
else if(data[mid]<targetValue){
left = mid+1;
fiboIndex-=2;//更新新区域的长度
}
else {
fiboIndex-=1;//更新新区域的长度
}
}
return 0;
free(fiboArray);
}