Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何优化二进制搜索?_Algorithm_Search_Optimization - Fatal编程技术网

Algorithm 如何优化二进制搜索?

Algorithm 如何优化二进制搜索?,algorithm,search,optimization,Algorithm,Search,Optimization,我一直在思考如何优化我的二进制搜索。代码如下。 到目前为止我所做的: 我所能想到的就是处理不同的输入 优化最坏情况(最坏情况之一),当正在搜索的元素超出范围时,即搜索低于最低值或高于最高值的数字。当保证在输入中找不到时,这将节省O(logn)比较 int input[15] = {1,2,2,3,4,5,5,5,5,6,7,8,8,9,10}; /* * Returns index p if a[p] = value else -ve int. * value is value being

我一直在思考如何优化我的二进制搜索。代码如下。 到目前为止我所做的:

我所能想到的就是处理不同的输入

优化最坏情况(最坏情况之一),当正在搜索的元素超出范围时,即搜索低于最低值或高于最高值的数字。当保证在输入中找不到时,这将节省O(logn)比较

int input[15] = {1,2,2,3,4,5,5,5,5,6,7,8,8,9,10};
/*
 * Returns index p if a[p] = value else -ve int.
 * value is value being searched in input.
 */
int
binary_search (int * input, int low, int high, int value)
{
    int mid = 0;
    if (!input) return -1;
    if (low > high) return -1;

    /* optimize worst case: value not in input */
    if ((value < input[low]) || (value > input[high]))
    { return -2; }

    mid = (low + high)/2;

    if (input[mid] == value) {
        return mid;
    }
    if (input[mid] > value) {
        return binary_search(input, low, mid -1, value);
    } else {
        return binary_search(input, mid+1, high, value);
    }
}
int输入[15]={1,2,2,3,4,5,5,5,6,7,8,8,9,10};
/*
*如果[p]=值else-ve int,则返回索引p。
*值是在输入中搜索的值。
*/
int
二进制搜索(int*输入、int低、int高、int值)
{
int-mid=0;
如果(!输入)返回-1;
如果(低>高)返回-1;
/*优化最坏情况:值不在输入中*/
如果((值<输入[低])| |(值>输入[高])
{return-2;}
中等=(低+高)/2;
如果(输入[mid]==值){
中途返回;
}
如果(输入[mid]>值){
返回二进制搜索(输入,低,中-1,值);
}否则{
返回二进制搜索(输入,中+1,高,值);
}
}
我能想到的另一个最糟糕的情况是,正在搜索的值位于输入的中间或第一个元素旁边。我认为更广义的是二进制搜索每次调用的输入的下限/上限。这也需要算法进行精确的logn比较


关于我可以重点改进哪些方面的任何其他建议。我不需要代码,但一个方向将是有益的。谢谢。

您正在考虑的优化类型——处理特殊情况——将不可避免地使您在其他情况下花费更多的时间。您的“最坏情况”优化使它们成为最佳情况,但代价是创建其他最坏情况。在本例中,您将两个案例划分为“最佳案例”,并将
n/2
案例划分为“最坏案例”,而之前没有。你把其他事情都拖慢了

(特别是在本例中,因为您正在检查每个递归是否过低/过高。)

如果您确实期望——在您的特定用例中——搜索将主要搜索太低或太高的值,那么这可能是一个好主意。不过,一般的经验法则是,最快的实现是最简单的。

Jon Bentley的编程珍珠(Programming Pearls)在优化二进制搜索方面有很好的一章。见本手册第4章

其中一种变体的效率惊人(参见“代码调优”一章的第87页):

#搜索1000个元素的数组
l=0
如果x[512]1000或x[p]!=t:
p=0#未找到

是的,我同意你的意见。一般来说,这种搜索太低/太高的情况比较少见。我有一份编程珍珠。这种联系合法吗?还有,你指的是哪种变体,我在解决第4栏中给出的问题。真的吗?你刚刚否决了计算机科学中最好的作品之一,这本书专门解决了如何优化二进制搜索的问题。顺便说一句,我不知道这个链接——这是谷歌的第一次点击。如果你拥有这本书,你应该直接引用它。不,那是为了链接,但我在看到你的编辑后投了赞成票。对此很抱歉。在我看来,二进制搜索的最佳优化方法是在n<1000时根本不使用它(因为由于缓存未命中,O(log(n))和O(n)或多或少都是相同的),并且在大型数据集上,每次迭代都会预取3或4个分区(很容易,因为这些分区是提前知道的)显而易见的一点:将递归重写为迭代。您的编译器可能会这样做,但不能保证。
# Search a 1000-element array
l = 0
if x[512] < t: l = 1000 + 1 - 512
if x[l+256] < t: l += 256
if x[l+128] < t: l += 128
if x[l+64] < t: l += 64
if x[l+32] < t: l += 32
if x[l+16] < t: l += 16
if x[l+8] < t: l += 8
if x[l+4] < t: l += 4
if x[l+2] < t: l += 2
if x[l+1] < t: l += 1
p = l + 1
if p > 1000 or x[p] != t:
    p = 0                   # Not Found