二进制搜索的算法时间复杂度

时间:2015-02-23 22:00:00

标签: time big-o time-complexity binary-search-tree binary-search

我试图找出算法的时间复杂度是什么,我有二进制搜索算法,一般是O(log n),我知道。但我在两个常数之间搜索,即x = 1和x = 2 ^ 31 - 1(整数的大小)。我认为在最坏的情况下,我的时间复杂度是log2(2 ^ 31)= 31,所以在最坏的情况下二进制搜索需要31步。但是,二进制搜索中的每一步我都调用一个函数,它具有O(n)运行时(只有一个输入大小的循环)。我的算法是否只是O(31n)= O(n)?

的顺序

我算法的输入:一个键,两个大小为n的数组a和b。

在代码中它看起来像这样:

    binarySearch(key, a, b)
    min = 0, max = 2^31 - 1
    mid = (min + max) / 2
    while (min<=max) { 
        x = function(mid, a, b); //this function has O(n)
        if (x==key) {
            return mid;
        } else if (x < key) { 
            min = mid + 1
        } else {
            max = mid - 1
        }
        mid = (min + max) / 2
    }
    return KEY_NOT_FOUND

我只是想确定,如果你有时间复杂性(减少的),请解释你的答案。

1 个答案:

答案 0 :(得分:2)

<强>更新

是的,你是对的。

在最坏的情况下,function()将被调用31次,每次调用都需要时间O(n),因此算法的运行时间由31 * O(n) = O(n)提供。


原始问题的解决方案x = function(mid)

您的问题有点可疑,算法的时间复杂度应为O(1)

当我们谈论算法的时间复杂性时,一个重点是:

  

我们总是考虑算法在输入大小方面需要的时间

在以下代码段中:

x = function(mid); //this function has O(n)

虽然function()可能是线性时间函数,但在您的情况下,function()仅从集mid中获取输入({0, 1, ..., 230}),因此在最坏的情况下function()及时计算max{T(0), T(1), ..., T(230)} = T,这是一个常数!

所以在最坏的情况下,你的while循环会调用function() 31次,所以在最坏的情况下你的算法会及时运行31 * T,这是一个常量。

请注意,算法的输入为key,算法的最差运行时间为31 * T,实际上独立的输入大小key!所以时间复杂度为O(1)

在你的情况下,我不认为谈论大O符号的时间复杂性是合适的。我建议你谈谈最坏情况下所需的计算步骤数。