二分法中的移位操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分法中的移位操作相关的知识,希望对你有一定的参考价值。

参考

    http://www.cnblogs.com/zhengjunfei/p/4714098.html

折半查找是进行假发与除法运算(mid={low+high}/2),插值查找进行复杂的四则运算

(mid=low+(high-low)*(key-a[low])/(a[high]-a[low])),而斐波那契额查找只是最简单加减运算(mid=low+F[k-1]-1),在海量数据的查找过程中,这种细微的差别可能会影响最终的查找效率。


    实际上在应用折半查找的过程中,通常都是通过移位的操作来实现除法的这一个细节,估计作者没有意识到。在一种最优使用斐波那契查找的条件是:当数据有一个二次方以上的递增过程,或者有一个性能的提升。但是这种性能的提升随机出现的概率还是太小了


发现实现的代码有问题,纠正如下:

int F[] = {0,1,1,2,3,5,8,13,21,34,55};


int Binary_Search(int* a, int n, int key)

{

  int low, mid, high, i, k;

  low  = 1;

  high = n;

  k    = 0;

  while(n>F[k]-1)

  {

    k++;

  }


  while (low <= high)

  {

    mid = low + F[k-1] - 1;

    if (key < a[mid])

    {

      high = mid - 1;

      k--;

    }

    else if (key > a[mid])

    {

      low = mid + 1;

      k = k - 2;

    }

    else

    {

      if (mid <= n)

      {

        return mid;

      }

      else

      {

        return n;

      }

    }

  }


  return 0;

}

int _tmain(int argc, _TCHAR* argv[])

{

  int num[] = {0, 1, 26, 24, 35, 47, 59, 62, 73, 88, 99};

  int size =  sizeof(num)/sizeof(num[0])-1;

  int result = Binary_Search(num, size, 62);

  printf("result:%d\n", result);

return 0;

}


以上是关于二分法中的移位操作的主要内容,如果未能解决你的问题,请参考以下文章

java中的移位操作

java中的位操作移位操作

java中的移位操作

C语言深度剖析深入理解C语言中的移位操作符(代码+图解)

使用移位操作代替乘除运算

移位操作符