【问题标题】:Algorithm time complexity with binary search二分查找算法时间复杂度
【发布时间】:2015-02-23 22:00:00
【问题描述】:

我想弄清楚我的算法的时间复杂度是多少,我有二进制搜索算法,我知道,这通常是 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

我只是想确定一下,如果您有时间复杂度(降低的时间复杂度),请解释您的答案。

【问题讨论】:

  • 如果您的列表已排序,那么是的,它是 O(n),但不一定是 31n,因为您必须计算常量的所有内容。
  • 没有列表,所以没有什么可排序的。我只是检查函数的输出是否等于 0

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


【解决方案1】:

更新

是的,你完全正确。

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


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

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

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

我们总是考虑算法所需的时间相对于其输入的大小

在下面的sn-p中:

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

虽然 function() 可能是一个线性时间函数,但在您的情况下,function() 仅从集合 {0, 1, ..., 2<sup>30</sup>} 中获取输入 (mid),因此在最坏的情况下 function() 会及时计算 @987654332 @,这是一个常数!

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

请注意,您的算法的输入是key,而您算法的最坏情况运行时间是31 * T,这实际上与您的输入key 的大小无关!所以时间复杂度是O(1)

在您的情况下,我认为用大 O 表示法来讨论时间复杂度是不合适的。我建议你谈谈在最坏情况下所需的计算步骤数。

【讨论】:

  • 谢谢你的回答很清楚,但是你让我意识到我在描述中犯了一个错误,我输入的大小不是'key'。我输入的大小是两个大小为 n 的整数数组。所以按照你的解释,我认为我是对的,对吗?我将更改描述。
  • @Chantal 你是绝对正确的,这种情况下的复杂性是O(n),原因与你在问题中所说的完全相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多