【问题标题】:Asymptotic lower bounding does not work. Why?渐近下界不起作用。为什么?
【发布时间】:2021-01-20 06:00:33
【问题描述】:

好吧,这显然不是一个家庭作业问题,但事情是这样的: 冒泡排序算法被称为 O(n^2), Ω(n)。 但是,如果我们将其时间复杂度绘制为图形(平均情况),并尝试对其下限,则更准确的下限将是 Ω(n^2)。然而,从上下文来看,我们看到 Ω(n) 是正确的。那么为什么下界算法的运行时不起作用呢?

【问题讨论】:

    标签: algorithm sorting time-complexity complexity-theory lower-bound


    【解决方案1】:

    下列说法均属实:

    • 对于每个数字 n,冒泡排序不会在长度为 n 的列表上执行超过 n(n-1)/2 次比较和 n(n-1)/2 次交换
    • 对于每个数字 n,存在一个长度为 n 的列表,冒泡排序在该列表上执行 n(n-1)/2 次比较和 n(n-1)/2 次交换(例如:以相反顺序排序的列表)
    • 对于每个数字 n,冒泡排序在长度为 n 的列表上执行的比较永远不会少于 (n-1) 次
    • 对于每个数字 n,都存在一个长度为 n 的列表,冒泡排序在该列表上执行精确 (n-1) 次比较和 0 次交换(例如:排序列表)
    • 对于每个数字 n,如果我们将列表 [1,2,...,n] 随机均匀地打乱,那么冒泡排序的预期交换次数为 n(n-1)/4 (解释:this answer on CS.stackexchange)

    结论:如果忽略乘法常数,最坏情况运行时间为n^2,冒泡排序最佳情况运行时间为n,平均运行时间为n ^2.

    请注意,“平均运行时间”总是有点模棱两可。为了消除歧义,我在上一个要点中做了不同的表述。如果您的随机列表遵循不同的概率分布,那么您将得到不同的结果。特别是,冒泡排序在包含大量重复元素的列表上将需要更少的交换(并且可能需要更少的比较)。但是,如果您不关心确切的乘法常数,那么生成“随机列表”的大多数“合理”方法将导致 n^2 的预期复杂度。

    现在,您的问题可能会变成:为什么冒泡排序的预期运行时间与其最坏情况的运行时间如此接近,而与最佳情况的运行时间相去甚远?

    这个问题的答案是:绝大多数排列是“合理地洗牌的”,只有少数排列是“几乎排序的”。换句话说,如果你随机打乱一个列表,那么结果将“看起来很随机”。如果你洗一副牌,你不小心把牌排序的概率很低。

    这个问题也有点骗人:最坏情况的比较次数是n^2/2;预期的比较次数为 n^2/4;最好的比较次数是 n-1。所以实际上,预期的比较次数几乎正好是最坏情况和最好情况之间的一半

    CS.stackexchange 上的答案也是一个很好的解释:在列表中的所有元素对中,我们预计一半的元素对是它们的相对顺序,而一半的元素对是相反的相对顺序。所以预期运行时间正好是最坏情况运行时间的一半。

    【讨论】:

      【解决方案2】:

      我认为你混淆了概念:

      1. 下限与上限:Ω(f(n)) 是下限,O(f(n)) 是上限。

      2. 最佳与最坏情况:除非另有说明,否则 Ω(f(n)) 和 O(f(n)) 均指最坏情况下的运行时间,作为输入大小的函数。

      对于冒泡排序,最坏情况大小为 n 的输入保证采用二次时间,因此冒泡排序为 O(n2 ) 和 Ω(n2)。

      “冒泡排序被称为 Ω(n)”的原因是很多人把它搞砸了。

      请记住,Ω(f(n)) 是函数的 集合,这些函数在 f(n) 下渐近界,当您看到“算法 X 是 Ω(f(n)) ”,阅读它“算法X的最坏情况运行时间 Ω(f(n))”。

      (但请注意,Dmitry 的答案也是正确的。因为 omega 是下界,Ω(1)、Ω(log n)、Ω(n)、Ω(n log n) 和 Ω(n2) 都适用)

      【讨论】:

      • 我会争辩说,用您自己的话来说,您是“搞砸”的人之一。 “冒泡排序是 Ω(n2)。”是错误的,因为存在冒泡排序只需要 n 次操作的输入。
      • 好吧,@Stef,你争论不正确。正如我所说,除非另有说明,否则界限通常适用于最坏的情况......但冒泡排序的平均情况时间也在 Ω(n^2)
      • @GameOver 总而言之,O、Ω 和 Θ 之间的选择表明我们讨论的是某个函数的上界、下界还是严格界(在这种情况下,算法的运行时间是输入大小的函数)。这与最坏情况、平均情况和最佳情况是分开的。为了完全准确,你必须清楚你正在研究哪种情况,但实际上平均情况和最坏情况通常是渐近相同的,最好的情况是完全无趣的,所以惯例是我们考虑最坏的情况,除非另有说明指定。
      • @GameOver 很多人犯了这个错误,有些是因为他们实际上是错误的,有些是因为他们并不真正关心错综复杂。课程讲师完全有可能给出错误的定义。要回答您的问题,您确实可以研究 O、Ω 和 Θ 中的每一个的最佳和平均以及最差和典型情况。例如,冒泡排序的最佳情况是在 Θ(n) 中,因此也在 Ω(n) 和 O(n) 中。同样,最坏和平均情况在 Θ(n**2) 中,因此也在 Ω(n**2) 和 O(n**2) 中。
      • @Stef 冒泡排序的运行时间通常不是输入大小的函数。这就是为什么当你将它称为一个函数时,例如说它在一组函数中,比如 Ω(n^2),读者必须假设你的意思是最好的、最坏的、平均的情况,或者其他 输入大小的函数。 “冒泡排序的运行时间为Ω(n^2)”这句话不假。它是模棱两可的,并且通过通常假设最坏的情况被提及来解决模棱两可的问题。
      【解决方案3】:

      根据定义,Ω(n) 是下限,不必太紧。它只是保证算法不会比线性更好。

      Ω(1), Ω(log(n)) 也是冒泡排序执行时间的有效下限。信息量不大,但仍然有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-14
        • 1970-01-01
        • 2011-10-21
        • 2011-12-10
        • 2017-05-03
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多