O和Ω与最坏情况和最佳情况有何关系?


33

今天,我们在一次讲座中讨论了一种非常简单的算法,该算法可使用二进制搜索在排序数组中查找元素。我们被要求确定元素数组的渐近复杂度。n

我的想法是,显然,或更具体,因为\ log_2 n是最坏情况下的操作数。但是我可以做得更好,例如,如果我第一次点击搜索到的元素-那么下界是\ Omega(1)O(logn)O(log2n)log2nΩ(1)

讲师将解决方案表示为Θ(logn)因为我们通常只考虑算法的最坏情况输入。

但是,仅考虑最坏的情况时,如果给定问题的所有最坏情况具有相同的复杂度(\ Theta是我们所需要的,对吗?),用OΩ意义何在?Θ

我在这里想念什么?


@Smaji:您的意思是“但是,仅考虑最坏的情况,当所有最坏的情况都具有+-相同的复杂度(Theta是我们所需要的,对吧?),那么具有大O和大Omega表示法有什么意义呢?”请澄清一下。
tanmoy 2014年

@Smajl:我认为您的问题是:算法分析中大O和大Omega符号的必要性是什么?我对么?
tanmoy 2014年

5
O(log2n)不比更具体O(logn),它们表示同一类功能。
拉斐尔

l o g b / l o g 2 × l o g bn )相同,因此2只是表示一个可以删除的因子(就像大的其他因子一样) -O。log2(n)log(b)/log(2)×logb(n)
CTRL-ALT-delor

Answers:


39

Landau符号表示函数的渐近界。有关OΩΘ之间差异的说明,请参见此处OΩΘ

最坏,最佳,平均或命名时间描述了不同的运行时函数:一个代表给定的最高运行时间序列,一个代表最低的运行时间,依此类推。n

就其本身而言,两者彼此无关。定义是独立的。现在我们可以继续对运行时函数制定渐近边界:上限值(),下限值Ω)或两者(Θ)。我们可以为最坏,最好或任何其他情况做。OΩΘ

例如,在二分搜索中,我们得到的最佳情况运行时渐近线和Θ log n 的最坏情况渐近线。Θ(1)Θ(logn)


对我而言,关键的一点是,我们可以对任何渐近有界函数进行最坏情况,最佳情况分析。对我而言,这表明了大O与最坏情况分析之间的独立性。谢谢!
Patrick

1
@帕特里克不完全是。首先,您决定要分析最坏情况,平均情况还是最佳情况。然后,您得出成本函数(或尽可能好的近似值)。只有那么你采取渐进性,如果在所有。
拉斐尔

17

请考虑以下算法(或过程,一段代码或其他):

Contrive(n)
1. if n = 0 then do something Theta(n^3)
2. else if n is even then
3.    flip a coin
4.    if heads, do something Theta(n)
5.    else if tails, do something Theta(n^2)
6. else if n is odd then
7.    flip a coin
8.    if heads, do something Theta(n^4)
9.    else if tails, do something Theta(n^5)

此函数的渐近行为是什么?

在最佳情况下(为偶数),运行时间为Ω n O n 2,而不是任何东西的ΘnΩ(n)O(n2)Θ

在最坏的情况下(为奇数),运行时间为Ω n 4O n 5,但不等于任何东西的ΘnΩ(n4)O(n5)Θ

的情况下,运行时间为Θ n 3n=0Θ(n3)

这是一个人为的示例,但这仅是为了清楚地说明界限与大小写之间的区别。如果您执行的活动没有任何已知的界限,则可以通过完全确定的过程使区分变得有意义。Θ


1
为了确定性,请沿情况进行拆分。nmod4
vonbrand,2015年

4

不必要。在这种情况下,即对排序数组进行二进制搜索,您可以看到:(a)二进制搜索最多执行步骤;(b)有输入实际上迫使这许多步骤。因此,如果T n 是二进制搜索的最坏情况输入的运行时间,则可以说T n = Θ log n [logn+1]T(n)T(n)=Θ(logn)

另一方面,对于其他算法,您可能无法精确算出,在这种情况下,对于最坏情况的输入,运行时间的上限和下限之间可能会有差距。T(n)

现在,对于搜索排序数组,还有更多的事情要做,那就是任何用于搜索排序数组的算法都需要检查。但是,对于这种下限,您需要分析问题本身。(这里的理念是:在任何时候,搜索算法不排除一些一套小号[ Ñ ]位置在那里的寻找元素可以是那么一个精心制作的输入可以保证。|小号|减少最多2倍。)[logn+1]S[n]|S|2


1

You are right, many people sloppily use O when they should use Θ. For example, an algorithm analyst may end up with a time function T(n)=n2+n+2 and immediately conclude that T(n)=O(n2), which is technically right, but a sharper assertion would be T(n)=Θ(n2). I attribute this oblivious behavior to two reasons. First, many see O to be more popular and acceptable, possibly because of its long history. Recall that it was introduced more than a century ago, whereas Θ (and Ω) were introduced only in 1976 (by Donald Knuth). Second, it could be because O is readily available on the keyboard, whereas Θ is not!

OΘΘΘ(1)Θ(logn)OO(logn)ΘO,反之则不一定正确。


Welcome, and thanks for taking the time to post an answer! However, I can't tell what your point is here. In the first paragraph, you offer some speculation. In the second, you propose a point of view that is "sloppy" itself: saying "it is O(logn) average case" does not say anything about the best case, except that its in the same class. Saying "it is Θ(logn)“平均情况”表示相同的上限!如果您想提供有关最佳情况的其他信息,则必须以任何一种方式明确给出。因此,我看不出您如何在O上使用O Θ。
拉斐尔

@Raphael我请您参考这两种符号的定义。此外,请注意,它们用于对运行时间的渐近“增长率”进行分类,而不是对各种答案和评论所传播的运行时间本身进行分类。
Hamed Nassar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.