Answers:
您指的是Landau符号。它们不是同一事物的不同符号,但含义完全不同。哪一个“更可取”完全取决于所需的陈述。
˚F 克≤ ˚F ∈ Ô (克)<表示最多渐近于增长,并且渐近并直到一个恒定因子;认为它是。是更严格的形式,即。
˚F 克ω ˚F ∈ Ω (克)克∈ Ô(˚F )具有对称含义:增长至少与一样快。是其更严格的表亲。您可以看到等同于。
˚F 克˚F ∈ Ô(克)∩ Ω (克)˚F 〜克Θ ö表示增长速度与一样快;正式为。(渐近相等)是其更强的形式。当使用时,我们通常指的是。
请注意及其兄弟如何成为函数类。当与他们进行“算术”时,非常意识到这一点及其精确定义非常重要,具体定义可能因交谈对象而异。
证明事物时,请小心使用精确的定义。周围有很多关于Landau符号的定义(都具有相同的基本直觉),其中一些在函数的某些集合上是等效的,而在其他函数集上则是等效的。
建议阅读:
如果您对以严格和合理的方式使用Landau表示法感兴趣,则可能对Rutanen等人的最新著作感兴趣。[1]。当我们在算法中使用它们时,它们为渐进符号制定了必要和充分的标准,表明通用定义无法满足它们,并提供了(实际上)可行的定义。
迄今为止,“大O”()是最常见的一个。当您分析算法的复杂性时,大多数时候,重要的是要在输入大小增大时确定运行时间¹增长的上限。基本上,我们想知道运行算法不会花费太长时间。我们无法用实际的时间单位(秒)来表示它,因为这将取决于精确的实现(程序的编写方式,编译器的性能,机器的处理器的速度等等)。因此,我们评估了不依赖于此类细节的内容,即当我们向算法提供更大的输入时,运行该算法需要花费多长时间。而且我们主要关心何时可以确定程序已完成,因此我们通常想知道它将花费那么多的时间或更少的时间。
要说一个算法对于输入大小n的运行时间为,则意味着存在某个常数K,这样该算法最多可以完成K个步骤,即算法的运行时间最多增长到 f的速度(达到比例因子)。注意到 Ť (Ñ )运行该算法为输入大小的时间 Ñ, ø (Ñ )非正式地表示 Ť (Ñ )≤ ˚F (Ñ )直到某个缩放因子。
有时,拥有比上限更多的信息会很有用。与O相反:它表示一个函数的增长至少与另一个函数一样快。Ť (Ñ )= Ω (克(Ñ ))意味着Ť (Ñ )≥ ķ '克(Ñ )对于某一常数ķ ',或把它非正式地,Ť (Ñ )≥ 克(Ñ )直到某个缩放因子。
当可以精确确定算法的运行时间时,将O和Ω结合起来:它表示函数的增长率是已知的,直到比例因子为止。Ť (Ñ )= Θ (ħ (Ñ ))意味着ķ ħ (Ñ )≥ Ť (Ñ )≥ ķ ' ħ (Ñ )对于一些常量ķ和ķ '。非正式地讲,T (直到某个缩放因子。
在复杂度分析中,很少使用“ 和“ ω ” 。小Ø比大做强ō ; 其中O表示增长不快,o表示增长严格慢。相反,ω表示严格更快的增长。
在上面的讨论中,我有些非正式。维基百科具有正式的定义和更数学的方法。
请记住,在等中使用等号是不正确的。严格地说,Ô (˚F (Ñ ))是一组变量的功能Ñ,我们应该写Ť ∈ Ô (˚F )。
由于这很干燥,让我举一个例子。大多数排序算法的运行时间都是二次方,即对于大小为的输入,算法的运行时间为O (n 2)。例如,选择排序的运行时间为O (n 2),因为选择第k个元素需要进行n - k个比较,总共需要进行n (n - 1 )/ 2个比较。事实上,比较次数总是恰好ñ (ñ -,其增长为 n 2。因此,我们可以更精确地了解选择排序的时间复杂度:它是 Θ (n 2)。
现在进行合并排序。合并排序也是二次的()。这是真的,但不是很精确。实际上,合并排序的运行时间为O (n。与选择排序类似,合并排序的工作流程基本上与输入的形状无关,并且其运行时间始终为 n直到一个恒定的乘数,即 Θ (n。
接下来,考虑quicksort。Quicksort更复杂。当然是。此外,快速排序的最坏情况是二次的:最坏情况是Θ (n 2)。但是,快速排序的最佳情况(当输入已经排序时)是线性的:对于快速排序的下限,我们通常可以说的最好是Ω (n )。我在这里不再赘述,但是快速排序的平均复杂度(在输入的所有可能排列中取平均值)是Θ (n。
在通用设置中,对于排序算法的复杂性有普遍的看法。假设一个排序算法只能在一个时间比较两个元件,具有是或否的结果(无论是或X > ÿ)。那么很明显,任何排序算法的运行时间始终为Ω (n )(其中n是要排序的元素数),因为该算法必须至少对每个元素进行一次比较才能知道适合的位置。例如,如果已经对输入进行排序,并且算法仅将每个元素与下一个元素进行比较并将其保持顺序(即n − 1),则可以满足此下限比较)。不太明显的是,最大运行时间一定是。该算法有时可能会进行较少的比较,但是必须有一个常数 K,以使得对于任何输入大小 n,至少有一个输入对算法进行的比较多于 K n l g(n )个。证明的思想是建立算法的决策树,即遵循算法从每个比较结果中得出的决策。由于每个比较都返回是或否结果,因此决策树是二叉树。有 n !输入的可能排列,并且算法需要在所有输入之间进行区分,因此决策树的大小为。由于树是二叉树,因此深度为Θ (l g(n !))= Θ (n适合所有这些节点。深度是算法执行的最大决策数,因此运行算法至少需要进行这么多比较:最大运行时间为 Ω (n。
¹ 或其他资源消耗,例如内存空间。在这个答案中,我只考虑运行时间。
通常用于说明上界(从上面的估计),而Ω是用来说明下边界(从下面的估计),和Θ当它们匹配时,在这种情况下可以使用Θ代替(通常)说明结果。