Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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 在进行指数搜索时,为什么我们选择指数的基数为2?_Algorithm_Search_Language Agnostic - Fatal编程技术网

Algorithm 在进行指数搜索时,为什么我们选择指数的基数为2?

Algorithm 在进行指数搜索时,为什么我们选择指数的基数为2?,algorithm,search,language-agnostic,Algorithm,Search,Language Agnostic,我们可以选择我们喜欢的任何一个基础,还是选择这个基础是因为它提供了最大的效率 我在看算法。这基本上给出了: template <typename T> int exponential_search(T arr[], int size, T key) { if (size == 0) { return NOT_FOUND; } int bound = 1; while (bound < size && arr[bo

我们可以选择我们喜欢的任何一个基础,还是选择这个基础是因为它提供了最大的效率

我在看算法。这基本上给出了:

template <typename T>
int exponential_search(T arr[], int size, T key) {
    if (size == 0) {
        return NOT_FOUND;
    }

    int bound = 1;
    while (bound < size && arr[bound] < key) {
        bound *= 2;
    }


    return binary_search(arr, key, bound/2, min(bound + 1, size));
}


为什么是2?为什么没有其他数字?

除了实现困难之外,使用k的乘数搜索位置n的成本是log(n)/log(k)+log((k-1)n)+O(1)=log(n)/log(k)+log(n)+log(k-1)+O(1)。通过增加k,我们可以使常数因子逼近,但不能达到1,但代价是常数项的增加。我想2已经足够好了。

除了实现困难之外,使用k的乘数搜索位置n的成本是log(n)/log(k)+log((k-1)n)+O(1)=log(n)/log(k)+log(n)+log(k-1)+O(1)。通过增加k,我们可以使常数因子逼近,但不能达到1,但代价是常数项的增加。我想,2已经足够好了。

没有更多的上下文就没有意义了,但您可能正在研究二进制搜索的类型-每个递归深度的问题减半,因此2的威力。@500 InternalServerError我添加了更多的上下文。一个基数为3的变体只会因为一点小的增益而变得更复杂。@HenkHolterman为什么会变得更复杂?我认为它在大型数据集上更有效?但由于二进制搜索,较小的数据集很容易处理。如果没有更多上下文,则毫无意义,但您可能正在研究二进制搜索的类型-每个递归深度的问题减半,因此2的威力。@500 InternalServerError我添加了更多的上下文。一个基数为3的变体只会因为一点小的增益而变得更复杂。@HenkHolterman为什么会变得更复杂?我认为它可以更好地处理大型数据集?但由于二进制搜索,较小的数据集很容易处理。对不起,请您解释一下,您是如何得出这个复杂度公式的。此外,公式的结论是,复杂度的最小值约为k=8.387。@harshit最好的k随着n的增加而增加。公式是指数搜索(n的底k对数,第一项)加上(k-1)n个元素上的二进制搜索。对不起,我不太熟悉这个复杂度的概念,但你不应该将两个对数相乘。先进行指数搜索,然后进行二进制搜索。这不应该跟在@harshit后面吗?对不起,你能解释一下你是如何得出这个复杂度公式的吗?另外,公式的结论是,复杂度的最小值约为k=8.387。@harshit最好的k随着n的增加而增加。公式是指数搜索(n的底k对数,第一项)加上(k-1)n个元素上的二进制搜索。对不起,我不太熟悉这个复杂度的概念,但你不应该将两个对数相乘。先进行指数搜索,然后进行二进制搜索。这不应该跟在@harshit后面吗
def exponential_search(arr, p):
i = 0
while (arr[2 ** i] < p):
    i += 1
binary_search(arr, p, i)
bound *=2