二分查找及改进
在优化程序时偶然看到这篇二分查找常见问题以及《算法珠玑》上的优化算法,但却并不完整.
|
在自己程序中测试了一下,改为最终的优化版后(也就是《珠玑》上的program4),比program1能提升10%左右,这和具体运算的内容有关~。 |
|
如果序列中有多个相同的元素时,查找的时候不见得每次都会返回第一个元素的位置, 比如考虑一种极端情况:序列中都只有一个相同的元素,那么去查找这个元素时,显然返回的是中间元素的位置. int search(int array[], int n, int v)
{
int left, right, middle;
left = -1, right = n;
while (left + 1 != right)
{
middle = left + (right - left) / 2;
if (array[middle] < v)
{
left = middle;
}
else
{
right = middle;
}
}
if (right >= n || array[right] != v)
{
right = -1;
}
return right;
}
这个算法是所有这里给出的算法中最完善的一个,正确,精确且效率高. |
//////////////////////
|
其实还有更好program4,我改成c++,在array内容为字串情况下,比上面的方法要好10% 如下:
int search(int array[], int n, int v)
{
int left, middle;
left = -1;
middle = 1;
if(n > 1)
{
for(int i=0;;i++)
{
if(mid >= n)
{
middle = middle>>1;
break;
}
middle = middle<<1;
}
}
if(array[middle-1] < elm)
left = n - middle;
while (middle != 1)
{
middle = middle>>2;
if (array[left+middle] < v)
{
left = left+middle;
}
}
if (right >= n || array[right] != v)
{
right = -1;
}
return right;
}
|
浙公网安备 33010602011771号