如何知道使用哪种时间复杂度分析符号?


90

在大多数入门算法课中,都引入了(大O)和等符号,并且学生通常会学会使用其中之一来查找时间复杂度。ΘOΘ

但是,还有其他符号,例如,和。在任何特定情况下,一种表示法要优于另一种表示法吗?oΩω


2
它与其说是最好应用 ...
VZN

Answers:


76

您指的是Landau符号。它们不是同一事物的不同符号,但含义完全不同。哪一个“更可取”完全取决于所需的陈述。

˚F ˚F Ô <fO(g)表示最多渐近于增长,并且渐近并直到一个恒定因子;认为它是。是更严格的形式,即。fgfo(g)<

˚F ω ˚F Ω Ô˚F fΩ(g)具有对称含义:增长至少与一样快。是其更严格的表亲。您可以看到等同于。fgωfΩ(g)gO(f)

˚F ˚F ÔΩ ˚F Θ öfΘ(g)表示增长速度与一样快;正式为。(渐近相等)是其更强的形式。当使用时,我们通常指的是。fgfO(g)Ω(g)fgΘO

请注意及其兄弟如何成为函数类。当与他们进行“算术”时,非常意识到这一点及其精确定义非常重要,具体定义可能因交谈对象而异。O(g)

证明事物时,请小心使用精确的定义。周围有很多关于Landau符号的定义(都具有相同的基本直觉),其中一些在函数的某些集合上是等效的,而在其他函数集上则是等效的。

建议阅读:

如果您对以严格和合理的方式使用Landau表示法感兴趣,则可能对Rutanen等人的最新著作感兴趣。[1]。当我们在算法中使用它们时,它们为渐进符号制定了必要和充分的标准,表明通用定义无法满足它们,并提供了(实际上)可行的定义。


  1. K. Rutanen等人的算法分析O标记的一般定义。(2015年)

5
我只想指出,尽管行为像≤,Ω的行为像,但是还是有区别的。不难发现功能˚F使得˚F Ô˚F Ω OΩgffO(g)fΩ(g)
Zach Langley'3

1
+1表示功能类。像Ω 2 n)之类的东西出现在纸和书中的各处,这对于第一次使用这些符号的人来说可能会造成混淆。o(1)Ω(2n)
Janoma'3

7
@ZachLangley你说的很对。这里没有总订单。完全可能很危险,但是我认为这符合直觉的目的。
拉斐尔

42

大O:上限

迄今为止,“大O”()是最常见的一个。当您分析算法的复杂性时,大多数时候,重要的是要在输入大小增大时确定运行时间¹增长的上限。基本上,我们想知道运行算法不会花费太长时间。我们无法用实际的时间单位(秒)来表示它,因为这将取决于精确的实现(程序的编写方式,编译器的性能,机器的处理器的速度等等)。因此,我们评估了不依赖于此类细节的内容,即当我们向算法提供更大的输入时,运行该算法需要花费多长时间。而且我们主要关心何时可以确定程序已完成,因此我们通常想知道它将花费那么多的时间或更少的时间。O

要说一个算法对于输入大小n的运行时间为,则意味着存在某个常数K,这样该算法最多可以完成K个O(f(n))nK步骤,即算法的运行时间最多增长到 f的速度(达到比例因子)。注意到 Ť Ñ 运行该算法为输入大小的时间 Ñ ø Ñ 非正式地表示 Ť Ñ ˚F Ñ 直到某个缩放因子。Kf(n)fT(n)nO(n)T(n)f(n)

下界

有时,拥有比上限更多的信息会很有用。O相反:它表示一个函数的增长至少与另一个函数一样快。Ť Ñ = Ω Ñ 意味着Ť Ñ ķ 'Ñ 对于某一常数ķ ',或把它非正式地,Ť Ñ Ñ 直到某个缩放因子。ΩOT(n)=Ω(g(n))T(N)Kg(n)KT(n)g(n)

当可以精确确定算法的运行时间时,OΩ结合起来:它表示函数的增长率是已知的,直到比例因子为止。Ť Ñ = Θ ħ Ñ 意味着ķ ħ Ñ Ť Ñ ķ ' ħ Ñ 对于一些常量ķķ '。非正式地讲,T ΘOΩT(n)=Θ(h(n))Kh(n)T(n)Kh(n)KK直到某个缩放因子。T(n)h(n)

进一步的考虑

在复杂度分析中,很少使用“ 和“ ω ” 。小Ø比大做强ō ; 其中O表示增长不快,o表示增长严格慢。相反,ω表示严格更快的增长。oωoOOoω

在上面的讨论中,我有些非正式。维基百科具有正式的定义和更数学的方法。

请记住,在等中使用等号是不正确的。严格地说,Ô ˚F Ñ 是一组变量的功能Ñ,我们应该写Ť Ô ˚F T(n)=O(f(n))O(f(n))nTO(f)

示例:一些排序算法

由于这很干燥,让我举一个例子。大多数排序算法的运行时间都是二次方,即对于大小为的输入,算法的运行时间为O n 2。例如,选择排序的运行时间为O n 2,因为选择第k个元素需要进行n - k个比较,总共需要进行n n - 1 / 2个比较。事实上,比较次数总是恰好ñ ñ -nO(n2)O(n2)knkn(n1)/2,其增长为 n 2。因此,我们可以更精确地了解选择排序的时间复杂度:它是 Θ n 2n(n1)/2n2Θ(n2)

现在进行合并排序。合并排序也是二次的()。这是真的,但不是很精确。实际上,合并排序的运行时间为O nO(n2)。与选择排序类似,合并排序的工作流程基本上与输入的形状无关,并且其运行时间始终为 nO(nlg(n))直到一个恒定的乘数,即 Θ nnlg(n)Θ(nlg(n))

接下来,考虑quicksort。Quicksort更复杂。当然是。此外,快速排序的最坏情况是二次的:最坏情况Θ n 2。但是,快速排序的最佳情况(当输入已经排序时)是线性的:对于快速排序的下限,我们通常可以说的最好是Ω n 。我在这里不再赘述,但是快速排序的平均复杂度(在输入的所有可能排列中取平均值)是Θ nO(n2)Θ(n2)Ω(n)Θ(nlg(n))

在通用设置中,对于排序算法的复杂性有普遍的看法。假设一个排序算法只能在一个时间比较两个元件,具有是或否的结果(无论是X > ÿ)。那么很明显,任何排序算法的运行时间始终为Ω n (其中n是要排序的元素数),因为该算法必须至少对每个元素进行一次比较才能知道适合的位置。例如,如果已经对输入进行排序,并且算法仅将每个元素与下一个元素进行比较并将其保持顺序(即n 1),则可以满足此下限xyx>yΩ(n)nn1比较)。不太明显的是,最大运行时间一定是。该算法有时可能会进行较少的比较,但是必须有一个常数 K,以使得对于任何输入大小 n,至少有一个输入对算法进行的比较多于 K n l gn )个。证明的思想是建立算法的决策树,即遵循算法从每个比较结果中得出的决策。由于每个比较都返回是或否结果,因此决策树是二叉树。有 n Ω(nlg(n))KnKnlg(n)n!输入的可能排列,并且算法需要在所有输入之间进行区分,因此决策树的大小为。由于树是二叉树,因此深度为Θ l gn = Θ nn!适合所有这些节点。深度是算法执行的最大决策数,因此运行算法至少需要进行这么多比较:最大运行时间为 Ω nΘ(lg(n!))=Θ(nlg(n))Ω(nlg(n))

¹ 或其他资源消耗,例如内存空间。在这个答案中,我只考虑运行时间。


1
“但是,快速排序的最佳情况(当输入已经排序时)是线性的”,这是最糟糕的情况!!
user5507'4

@ user5507:实际上,这取决于透视策略。如果选择第一个(或最后一个)元素作为枢轴,那么您是对的;但是,如果您选择中间元素或第一,中间,最后一个中间值,则排序输入是最好的情况。
chirlu 2013年

“在复杂度分析中,很少使用o和ω的情况很少。” 在空间复杂度分析中并非如此。在时间复杂度分析中,通常在计算特定操作(比较,磁盘搜索,高速缓存未命中以及所拥有的内容)时使用o和ω。但是,由于您总是可以等待并购买一台速度更快的计算机,因此“挂墙时间”始终是“固定不变的因素”,因此big-O更为常见。在空间分析中,由于信息论的原因,通常存在严格的下界,因此将大小报告为“ f(n)+ o(f(n))位”是非常普遍的,其中f(n)是下界。
别名2014年

虽然我认为:如果f(n)是某个数据结构大小的理论下限,则使用f(n)+ O(1)(恒定开销)的那个称为“隐式”,即使用f(n)+ O(f(n))(恒定相对开销)称为“紧凑”,而使用f(n)+ o(f(n))(相对开销最终变得微不足道的)称为“简洁” ”。知道您是否需要在该领域工作的好条件。
别名2014年

17

通常用于说明上界(从上面的估计),而Ω是用来说明下边界(从下面的估计),和Θ当它们匹配时,在这种情况下可以使用Θ代替(通常)说明结果。OΩΘΘ


3
“典型地”?它们可以用于其他用途吗?
2013年

1
@svick,是的,例如,其不是一个上界语句。用上限语句表示类似f = O g )的表达式,它表示f的上限。P=DTime(nO(1))f=O(g)f
卡夫

4
实际上,Kaveh,这一个上限声明。“ ” 的恰当英文翻译是“ P是可以使用AT MOST多项式运算数解决的问题集”。如果您并不意味着“最多”,你应该有书面P = d 牛逼中号Ë ñ Θ 1 。(当然,两种说法都是正确的。)P=DTime(nO(1))P=DTime(nΘ(1))
JeffE 2012年

@JeffE,我将其视为函数集之间的相等性,但是您是对的,也可以将其视为更一般意义上的上限。
卡夫

@JeffE实际上,中,由于d Ť 中号ÈΘ Ñ 登录Ñ Pd Ť 中号ÈΘ Ñ 登录Ñ d Ť 中号èñ Θ 1 =PDTIME(nΘ(1))DTIME(Θ(nlogn))PDTIME(Θ(nlogn))DTIME(nΘ(1))=
David Richerby 2014年
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.