【发布时间】:2014-06-01 06:49:29
【问题描述】:
这个问题很简单,但我就是找不到足够好的答案。在the most upvoted SO question regarding the big-O notation 上,它说:
例如,排序算法通常基于比较操作(比较两个节点以确定它们的相对顺序)进行比较。
现在让我们考虑一下简单的冒泡排序算法:
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j+1]) {
switchPlaces(...)
}
}
}
我知道最坏的情况是O(n²),最好的情况是O(n),但究竟什么是n?如果我们尝试对已经排序的算法进行排序(最好的情况),我们最终会什么都不做,那么为什么它仍然是O(n)?我们仍在循环 2 个 for 循环,所以如果有的话,它应该是 O(n²)。 n 不能是比较操作的次数,因为我们还是比较所有的元素吧?
【问题讨论】:
-
n 是要排序的数组的长度。即使数组已排序,您也需要进行 n - 1 次比较来验证这一点。
-
“WC”和“BC”应该是什么?请避免使用不常见的缩写,你不能确定人们会理解他们扩展的内容。
-
假设 WC 和 BC 表示最坏情况和最佳情况,您展示的算法没有最佳情况 O(n),因为它在找到数组时不会提前退出已排序。
-
@NiklasB。 n 是数组的长度?这个怎么可能?对于 O(n^2) 的最坏情况,数组的长度不会改变?
-
@eitank 不正确。在处理排序算法时,N 表示要排序的元素总数。你访问内存的次数将是一个函数
f(n),即N的一个函数。
标签: algorithm big-o complexity-theory time-complexity