曾经我理解过这个算法,但现在不再理解了。假设我有一个算法,可以返回数组中间的数字。
for (int i = 0; i < nums.length; i++) {
if (i == nums.length / 2) return nums[i];
}
这种情况的最坏时间复杂度始终为O(n/2),对吗?没有比这更糟糕的情况了。但是我们为什么会得出它的时间复杂度是O(n)的结论呢?
曾经我理解过这个算法,但现在不再理解了。假设我有一个算法,可以返回数组中间的数字。
for (int i = 0; i < nums.length; i++) {
if (i == nums.length / 2) return nums[i];
}
这种情况的最坏时间复杂度始终为O(n/2),对吗?没有比这更糟糕的情况了。但是我们为什么会得出它的时间复杂度是O(n)的结论呢?
大O时间复杂度并不是用来测量算法实际执行时间的,它指定了时间复杂度所依赖的变量以及这些变量与时间复杂度之间的关系(例如线性、多项式、指数等)。
由于常数不影响时间复杂度函数的类型,它们不会改变大O值。
请注意,在您的情况下,您编写的代码可能会被编译成具有恒定时间的内容,如果编译器足够聪明以注意到循环的所有迭代都死亡但一个。
n
上更快的具有更高 O()
的算法并不罕见。 - Mark Ransom
O(...)
分析,常数并不重要。重要的是随着元素数量的增加,时间如何增长,而不是时间的绝对值。 - Mark Ransomif (i == nums.length / 999999999) return nums[i];
而不是if (i == nums.length / 2) return nums[i];
,那么它总是会返回第一个元素。所以(O(n / 99999999)技术上是O(1)吗? - Zanko