于七月末最后一次发文之后,便进入了极其混沌的暑假时光,每天至少打12个小时的电脑游戏,虚度了大好时光,十分可惜,于此记之,以明志。
今日开始学习生活重回正轨。
今天带来的是斐波那契查找,它是利用黄金分割原理来实现的。
何为黄金分割原理?笔者自身也不知道,我将它理解为一种类似于公理的原理,记住即可,不需要知道其中的原理,就如同下放的代码一样,与折半查找大致相同,只是几个地方做出了修改,把它记住即可,不需要知道原理。
int Fibonacci_Search(int a[],int n,int key){
//a数组为目标数组,n为a数组的长度,key为要在目标数组中具体查找的数据
int low,hign,mid,i,k;
k=0;
//下面的F数组即斐波那契数列
//0 1 1 2 3 5 8 13 21 34 ...
while(n>F[k]-1){
k++;
}
for(i=n;i<F[k]-1;i++){
a[i] = a[n];
}
while(low<=high){
mid = low + F[k-1]-1;//计算当前分隔的下标
if(key<a[mid]){//查找记录小于当前分隔记录
high = mid-1;//调整最高下标
k-=1;//斐波那契数列下标减一位
}
else if(key>a[mid]){//与上同理
low = mid+1;
k-=2;
}
else{
if(mid<=n){
return mid;//若相当且mid小于n,则直接返回mid
}
else
return n;//若mid大于n,则说明是补全数值,返回n
}
}
return 0;
}
斐波那契查找的时间复杂对亦为O(nlogn),但就平均性能而言,斐波那契查找(仅仅进行了加减运算)要优于折半查找(不断地进行乘除运算)。
综上,三种有序表的查找全部介绍完成了(折半,插值与斐波那契),它们各有优劣,实际开发时可根据数据特点进行选择。