关于二分法中,斐波那契查找算法对于对半查找法优势的理解

在我印象的二分查找法中,对半查找法应该是效率最高的,但是今天我突然发现一个叫做“斐波那契查找法”的算法,这个算法竟然比对半查找法更有效率,以下是算法介绍和我的理解 斐波那契查找法实现代码:

  1. #include “stdafx.h”  
  2. #include <memory>  
  3. #include  <iostream>  
  4. using namespace std;  
  5.   
  6. const int max_size=20;//斐波那契数组的长度  
  7.   
  8. /*构造一个斐波那契数组*/   
  9. void Fibonacci(int * F)  
  10. {  
  11.     F[0]=0;  
  12.     F[1]=1;  
  13.     for(int i=2;i<max_size;++i)  
  14.         F[i]=F[i-1]+F[i-2];  
  15. }  
  16.   
  17. /*定义斐波那契查找法*/    
  18. int Fibonacci_Search(int *a, int n, int key)  //a为要查找的数组,n为要查找的数组长度,key为要查找的关键字  
  19. {  
  20.   int low=0;  
  21.   int high=n-1;  
  22.     
  23.   int F[max_size];  
  24.   Fibonacci(F);//构造一个斐波那契数组F   
  25.   
  26.   int k=0;  
  27.   while(n>F[k]-1)//计算n位于斐波那契数列的位置  
  28.       ++k;  
  29.   
  30.   int  * temp;//将数组a扩展到F[k]-1的长度  
  31.   temp=new int [F[k]-1];  
  32.   memcpy(temp,a,n*sizeof(int));  
  33.   
  34.   for(int i=n;i<F[k]-1;++i)  
  35.      temp[i]=a[n-1];  
  36.     
  37.   while(low<=high)  
  38.   {  
  39.     int mid=low+F[k-1]-1;  
  40.     if(key<temp[mid])  
  41.     {  
  42.       high=mid-1;  
  43.       k-=1;  
  44.     }  
  45.     else if(key>temp[mid])  
  46.     {  
  47.      low=mid+1;  
  48.      k-=2;  
  49.     }  
  50.     else  
  51.     {  
  52.        if(mid<n)  
  53.            return mid; //若相等则说明mid即为查找到的位置  
  54.        else  
  55.            return n-1; //若mid>=n则说明是扩展的数值,返回n-1  
  56.     }  
  57.   }    
  58.   delete [] temp;  
  59.   return -1;  
  60. }  
  61.   
  62. int _tmain(int argc, _TCHAR* argv[])  
  63. {  
  64.     int a[] = {0,16,24,35,47,59,62,73,88,99};  
  65.     int key=100;  
  66.     int index=Fibonacci_Search(a,sizeof(a)/sizeof(int),key);  
  67.     cout<<key<<” is located at:”<<index;  
  68.     system(“PAUSE”);  
  69.     return 0;  
  70. }

(代码参考于: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)),且
对半查找法我们从信息论的信息熵的相关知识能看出,
对半查找法在执行步数上仍然比
斐波那契二分查找法更少 但是从以上我们也能发现,斐波那契二分查找法在核心算法上,只有赋值与减法运算,对半查找法却有除法运算,所以这应该就是它的优势所在吧。

    原文作者:查找算法
    原文地址: https://blog.csdn.net/GGHS_up/article/details/72860314
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞