最坏情况下的运行时间复杂度用Big O表示,最好情况下用Ω表示,但为什么有时候最坏情况下也会使用Ω?

10

我有些困惑,我以为在描述最坏情况的运行时间时要使用大O符号,而Ω符号用于最好情况?能否有人解释一下?

那么(lg n)不是最好情况吗?(nlg n)才是最差情况?或者我误解了什么?

证明堆大小为n时Max-Heapify的最坏情况运行时间是Ω(lg n)。(提示:对于具有n个节点的堆,给出节点值,使得从根到叶子的每个节点上都会递归调用Max-Heapify。)

编辑:不,这不是作业。我正在练习,这有一个答案,但我感到困惑。 http://www-scf.usc.edu/~csci303/cs303hw4solutions.pdf问题4(6.2-6)

编辑2:所以我误解了问题,它与大O和Ω无关?


1
相关:二分查找的复杂度 - Gumbo
@Gumbo在你的链接中提到了他的分析是最坏情况:Theta(logn + k),难道不应该是Theta(logn)吗?因为你可以忽略+k。 - jantristanmilan
1
是的,找到其他k-1个附近的标题将是微不足道的。 - Gumbo
Ω(1)是最好的情况;-) - hertzsprung
3个回答

22
重要的是要区分案例和边界。
在分析算法时,最好、平均和最差是常见的感兴趣的案例。
上限(O,o)和下限(Omega,omega)以及Theta是函数的常见边界。
当我们说“算法X的最坏时间复杂度是O(n)”时,我们是说代表算法X性能的函数,在将输入限制为最坏情况输入时,从上面渐近地受到某些线性函数的限制。你可以谈论最坏情况输入的下限;或者关于平均、最佳情况下行为的上限或下限。
案例!=边界。话虽如此,“最坏情况下的上限”和“最好情况下的下限”是相当合理的指标……它们提供了算法性能的绝对边界。这并不意味着我们不能谈论其他指标。
编辑以回答您更新后的问题:
该问题要求您展示Omega(lg n)是最坏情况下行为的下界。换句话说,当该算法尽可能多地完成一类输入的工作时,它所做的工作量至少与(lg n)一样快地增长,渐近地。因此,您的步骤如下:(1)确定算法的最坏情况;(2)找到算法在属于最坏情况的输入上运行时间的下限。
这里是线性搜索的演示:
在线性搜索的最坏情况下,目标项目不在列表中,并且必须检查列表中的所有项目才能确定此项。因此,该算法最坏情况下的复杂度的下界是O(n)。
需要注意的重要一点是,对于许多算法,大多数情况的复杂度都会被常见的一组函数从上面和下面限制。 Theta边界非常常见。因此,在任何情况下,Omega和O或许没有不同的答案。

我曾经认为明智的度量标准是“平均情况下的上限”,但平均情况往往比最坏情况更难确定。(考虑快速排序,其中最坏情况是病态的。) - millimoose
@millimoose 我更倾向于说明智的界限是最坏情况的上界,而快速排序是例外(因为我们更喜欢忽略病态最坏情况,以便证明使用它比真正的O(n log n)最坏情况算法更好)。话虽如此,我没有参考资料或证书来支持“最坏情况的上界”比“平均情况的上界”更有“意义”的说法,所以我可以澄清这是我的评估,而不是普遍接受的。 - Patrick87
在任何给定的程序中,你是否经常得到最坏情况的输入?通常不会,因此平均情况复杂度将决定你实际观察到的性能,对于任何算法,无论病态或非病态。然而,这个命题的推论是,具有病态最坏情况复杂度的算法可能会导致DOS漏洞,就像最近的Java parseDouble() 漏洞一样。另一个推论是,使用适合你所拥有的输入数据类型的算法是有意义的,这就是为什么timsort是很棒的原因。 - millimoose
总的来说,我同意选择算法的度量标准应该取决于具体情况。例如,有些情况可能需要一个平均性能良好且偶尔出现性能不佳的算法,而另一些情况可能需要更加稳定可扩展的性能。在理论上下文中,最坏/上界和最优/下界更重要,因为它们可以说明问题所处的复杂度类别。 - Patrick87
1
@Patrick87,“因此,该算法最坏情况下的复杂度的下界是O(n)”是一个错别字吗?难道不应该是:“因此,该算法最坏情况下的复杂度的下界是Omega(n)?” - tmakino

-1
实际上,你使用大O符号表示增长速度比最坏情况复杂度还要快的函数,使用Ω符号表示增长速度比最坏情况复杂度更慢的函数。
所以在这里,你需要证明你的最坏情况复杂度比lg(n)还要糟糕。

"比 lg(n) 更差" - 或许你应该说 "渐进地更大于(asymptotic greater than)"。 - Zeta
所以我误解了问题,不是关于大O和Ω吗? - jantristanmilan
在我们的考试中,你必须说“更糟”,因为如果它更大,那就更糟了,对吧? - jantristanmilan

-1

O是上限(即最坏情况) Ω是下限(即最好情况)

这个例子是说在max-heapify的最坏输入情况下(我猜最坏输入是反向排序的输入),运行时间复杂度必须是(至少)lg n。因此,Ω(lg n)是执行复杂度的下限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接