大话数据结构——斐波那契查找~2020.8.12

于七月末最后一次发文之后,便进入了极其混沌的暑假时光,每天至少打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),但就平均性能而言,斐波那契查找(仅仅进行了加减运算)要优于折半查找(不断地进行乘除运算)。
综上,三种有序表的查找全部介绍完成了(折半,插值与斐波那契),它们各有优劣,实际开发时可根据数据特点进行选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值