这取自名为Intro to Algorithms的畅销书。作者指出,在最坏的情况下,任何比较排序算法都需要Ω(nlgn)比较。以冒泡排序算法为例,在最坏的情况下,我们有一个上限O(n ^ 2)。 Omega表示较低或最小的边界,因此最坏情况的下限不会是Ω(n ^ 2)?如果气泡排序具有下限,例如建议的Ω(nlgn),而不是最差情况下的n ^ 2?在最糟糕的情况下,性能冒泡排序不能至少采用nlgn。
答案 0 :(得分:3)
作者说任何算法:在最坏的情况下,没有算法能比Ω(N Log(N))
更好。
原因很容易理解:任何基于比较的排序算法都是二元决策树(if-then-else的长动态序列)。由于算法必须能够处理数据的任何排列,因此它必须能够以不同的方式置换所有N!
个案例,并且树必须至少具有多个叶子。因此,决策树的高度,即最坏情况的复杂性,至少为Lg(N!)=Ω(N.Log(N))
。
当决策树平衡良好(Heapsort)时,高度也是O(N.Log(N))
。
当决策树强烈失衡(Bubblesort)时,高度可能变为O(N²)
。
<强>附录强>:
由于Ω
表示下限,因此任何下限都是有效的。因此,冒泡排序的最差情况是Θ(N²)
,它也是Ω(N²)
,Ω(N.Log(N))
,Ω(N)
,Ω(Log N)
,Ω(1)
......
答案 1 :(得分:1)
稍微过度简化*,当我们谈论算法问题的下限时,我们对最佳算法在最差情况下的表现感兴趣。最好的基于比较的排序算法(例如,mergesort)在最坏的情况下使用大约n log n比较,因此排序的下限被引用为Omega(n log n)。不是最好的算法,例如冒泡排序,可能比最坏情况下的最佳算法更糟糕。在最好的情况下,它们可能比最佳算法做得更好。这些事实都不符合排序的下限。
*可能没有一个最佳算法。
答案 2 :(得分:0)
您需要关注“至少”的含义,用Ω
表示。
“在最坏的情况下,冒泡排序需要进行Ω(nlg(n))
比较”这不是一个错误的陈述,因为它需要至少knlg(n)
比较一些常数k
。
是的,我们知道在最坏的情况下,冒泡排序需要Ω(n^2)
。但是,这并不会使上述声明为假。因此,作者声称是正确的。
这是一个例子,希望澄清情况:
“无论我有多累,我都可以做至少50次俯卧撑”
所以知道,下面的语句是假的吗?
“无论我有多累,我都可以做至少20次俯卧撑”
答案 3 :(得分:0)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.8/d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/2.3.0/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>