【问题标题】:Difficulty in comprehending asymptotic notation难以理解渐近符号
【发布时间】:2018-08-25 20:18:59
【问题描述】:

据我所知和研究,

Big - Oh 表示法描述了算法时间复杂度的最坏情况。

Big - Omega 表示法描述了算法时间复杂度的最佳情况。

Big - Theta 表示法描述了算法时间复杂度的平均情况。

Source

但是,最近几天,我看到一些人在讨论中这样说

在最坏的情况下,O 是一个“可以原谅的”误解。最好的 Θ 很简单 错误的。最好的Ω也是可以原谅的。但他们仍然存在误解。

big-O 符号可以表示任何复杂性。事实上它可以 描述任何函数的渐近行为。

我还记得我在大学课程中学习了前一个。我还是个学生,如果我认错了,请你解释一下吗?

【问题讨论】:

  • “有些人”是正确的。见:How do O and Ω relate to worst and best case?
  • @Dukeling Big - Oh 表示法描述了算法时间复杂度的最坏情况。 错误????
  • 是的,几乎所有这些都是错误的:“Big - Oh 表示法用于定义算法在时间复杂度方面的上限。这意味着 Big - Oh 表示法始终表示最大时间算法要求所有输入值。这意味着 Big - Oh 表示法描述了算法时间复杂度的最坏情况。”。 [它是一个上限,但它是一个函数,而不是一个算法。]

标签: algorithm math time-complexity asymptotic-complexity


【解决方案1】:

Bachmann-Landau 符号与算法的计算复杂度完全无关。 1894 年,当 Bachmann 和 Landau 发明这种表示法时,计算机计算算法的想法并不真正存在,这一点应该已经很明显了。

Bachmann-Landau 表示法通过将函数组合成以大致相同的速率增长的函数集来描述函数的增长率。 Bachmann-Landau 符号没有说明这些函数的含义。它们只是函数。事实上,它们根本没有任何意义。

他们的意思是:

  • f ∈ ο(g): f 增长比 g 慢
  • f ∈ Ο(g):f 的增长速度没有明显快于 g
  • f ∈ Θ(g):f 的增长速度与 g 一样快
  • f ∈ Ω(g):f 的增长速度没有明显慢于 g
  • f ∈ ω(g):f 增长速度快于 g

它没有说明 f 或 g 是什么,或者它们的含义。

请注意,实际上存在两个相互冲突、不兼容的 Ω 定义;这里给出的一个对计算复杂性理论更有用。另请注意,这些只是非常广泛的直觉,如有疑问,您应该查看定义。

如果需要,您可以使用 Bachmann-Landau 表示法将兔子种群的增长率描述为时间的函数,或者将人的腹部的增长率描述为啤酒的函数。

或者,您可以使用它来描述最佳情况步复杂度、最坏情况步复杂度、平均情况步复杂度、预期情况步复杂度、摊销步复杂度、最佳情况时间复杂度、最坏情况时间算法的复杂度、平均情况时间复杂度、预期情况时间复杂度、摊销时间复杂度、最佳情况空间复杂度、最坏情况空间复杂度、平均情况空间复杂度、预期情况空间复杂度或摊销空间复杂度。

【讨论】:

    【解决方案2】:

    这些断言充其量是不准确的,最坏的情况是错误的。这是事实。

    • 算法的运行时间不是 N 的函数(因为它还取决于特定的数据集),因此您不能直接讨论它的渐近复杂度。你只能说它介于最好和最坏的情况之间。

    • 最坏情况、最佳情况和平均情况运行时间是 N 的函数,虽然平均情况取决于数据的概率分布,因此没有唯一定义。

    那么渐近符号是这样的

    • O(f(N)) 表示一个上限,可以紧也可以不紧;

    • Ω(f(N)) 表示下限,可以紧也可以不紧;

    • Θ(f(N)) 表示双边界,即 O(f(N)) 和 Ω(f(N)) 的合取;它非常紧。

    所以,

    • 所有最坏情况、最佳情况和平均情况的复杂性都有一个 Θ 界限,因为它们是函数;在实践中,这个界限很难建立,我们满足于更宽松的 O 或 Ω 界限。

    • Θ 界限只保留给平均情况是绝对不正确的。

    例子:

    快速排序的最坏情况是 Θ(N²),其最佳和平均情况是 Θ(N Log N)。所以由于语言滥用,快速排序的运行时间是 O(N²) 和 Ω(N Log N)。

    插入排序的最坏情况、最好情况和平均情况都是三个 Θ(N²)。

    任何需要查看所有输入的算法都是最佳情况、平均情况和最坏情况 Ω(N)(如果没有更多信息,我们无法确定任何上限)。

    已知矩阵乘法在 O(N³) 时间内是可行的。但是我们仍然不能准确地知道这个操作的 Θ 界限,它是 N² 乘以一个缓慢增长的函数。因此 Ω(N²) 是一个明显但不严格的下限。 (最坏、最好和平均情况的复杂性相同。)


    由于最佳/平均/最差情况需要明确定义的持续时间,而一般情况位于一个范围内(它实际上是一个随机变量),因此存在一些混淆。此外,算法分析通常很乏味,如果不是难以处理的话,我们会使用可能导致松散界限的简化。

    【讨论】:

    • 我不认为这是真的,甚至没有意义:“通常快速排序的运行时间是 O(N²) 和 Ω(N Log N)”。这可能就是导致上述误解的那种事情。
    • @MattTimmermans 如果有些概念解释有误,您为什么不更愿意通过编写新答案来解决它们??
    • @YvesDaoust“通常快速排序的运行时间为 O(N²) 和 Ω(N Log N)”在原始报价中重复问题。您似乎使用 O 和 Ω 来指示算法的最坏和最佳情况运行时间。
    • @Dukeling:我解释了一般的运行时间不是一个函数,关于它的讨论不够严谨。
    • 您开始说断言介于不准确和错误之间,但随后您继续非正式地重申它很好(减去 Theta)。您可能想编辑其中一个,或者我误读了什么?在最坏的情况下,您是在说它们不完整或部分正确,或者在形式上说不正确。