【问题标题】:Running Time Complexity of O (n / 2)O (n / 2) 的运行时间复杂度
【发布时间】:2016-10-25 22:13:32
【问题描述】:

我曾经明白这一点,但现在不明白了。假设我有一个算法可以返回数组中间的数字。

for (int i = 0; i < nums.length; i++) {
  if (i == nums.length / 2) return nums[i];
}

最坏的情况总是 O (n / 2) 对吧?没有比这更糟糕的情况了。但是我们怎么就断定是 O(n) 呢?

【问题讨论】:

  • 对于O(...) 的目的,常量无关紧要。这完全是关于时间如何随着元素数量的增加而增加,而不是关于时间的绝对值。
  • 2 是一个常数因子,所以O(n/2) 可以简化为O(n)。换句话说,查看一半元素的复杂性并不比查看所有元素差。
  • 困扰我的是 O(n/2) 减少到 O(n)。如果编写代码而不是 if (i == nums.length / 2) return nums[i]; 我们有 if (i == nums.length / 999999999) return nums[i]; 那么它将始终是第一个元素。所以 (O(n / 99999999) 在技术上是 O(1) ?
  • @Zanko 不,O(n / 99999999) 仍然是 O(n),因为对 n 没有限制。如果 n=9999999999999999999999999 你可以看到它仍然比 n=1 需要更长的时间。

标签: algorithm time-complexity


【解决方案1】:

Big O 时间复杂度不是衡量算法将花费的实际时间,而是指定时间复杂度依赖于哪些变量以及这些变量与时间复杂度之间存在什么样的关系(即线性、多项式、指数等)。

因为常量不会影响函数的类型,所以时间复杂度是它们不会改变大 O 值。

请注意,在您的情况下,如果编译器足够聪明,可以注意到循环的所有迭代都是死的,但只有一个,那么您编写的代码实际上可能会编译成具有恒定时间的东西。

【讨论】:

  • 你好,如果我有另一种算法循环整个数组而不是一半。所以它们都是 O(n)。但是当人们想知道哪个更快时,他们会说它的速度是一样的,但实际上循环到一半的速度是原来的两倍!
  • @Zanko 确实如此,但是 Big O 不是该工作的工具。我不知道另一种表示法来准确描述您正在寻找的东西(并不是说它不存在,只是我不知道)。我只想用一些词来形容一个比另一个快一倍
  • @Zanko 知道哪种算法更快不是 Big-O 的用处——它用于预测算法如何对不同大小的输入做出反应!找到具有较高 O() 的算法在较小的 n 上更快的情况并不少见。
  • 如果要保持不变,可以使用tilde notation。然而,虽然由 Sedgewick 和 Wayne 开创,但并不常见。
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 2015-05-25
  • 2019-12-13
相关资源
最近更新 更多