【发布时间】: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 需要更长的时间。