二分法中的移位操作
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;
}
以上是关于二分法中的移位操作的主要内容,如果未能解决你的问题,请参考以下文章