【问题标题】:Expected running time vs. worst-case running time预期运行时间与最坏情况运行时间
【发布时间】:2011-10-25 21:26:49
【问题描述】:

我正在研究随机快速排序算法。我意识到这个算法的运行时间总是表示为“预期运行时间”。

指定或使用“预期运行时间”的原因是什么?我们为什么不计算最坏或平均情况?

【问题讨论】:

标签: algorithm random quicksort asymptotic-complexity


【解决方案1】:

有时,预期运行时间是指随机选择的输入的平均运行时间。但是,如果它是一个随机算法,那么通常意味着对于每个输入,该算法做出的随机选择的预期运行时间。这就是这里的意思。对于 n 个项目的每个输入,随机快速排序平均运行时间为 O(n(log n)),仅在其掷硬币时取平均值。

在这种有限的意义上,预期运行时间是随机算法运行时间的一个非常合理的衡量标准。如果您只担心算法在内部翻转硬币时可能发生的最坏情况,那么为什么还要费心翻转硬币呢?你不妨把它们都变成头。 (在随机快速排序的情况下,会将其简化为普通快速排序。)

平均情况与最坏情况是一个更严重的问题,当它是输入的平均值而不是硬币翻转的平均值时。在这种情况下,平均运行时间充其量只是一个不适应输入类型变化的数字——算法的不同用途可能有不同的输入分布。我说充其量是因为您可能不知道输入的假设分布才是真正的用法。

只有当你既想在抛硬币不倒霉时跑得快,又想在抛硬币倒霉时跑得太慢时,才考虑抛硬币的最坏情况。例如,假设您需要一个用于氧气供应调节器的排序算法(用于医疗患者或水肺潜水员)。那么随机快速排序只有在你们都希望结果通常非常快时才有意义,为了用户的方便,并且如果最坏的情况无论如何都不会让用户窒息。这是排序算法的人为场景,因为有非随机排序算法(如归并排序)并不比快速排序慢很多,甚至平均而言。对于像素数测试这样的问题,随机算法比非随机算法快快。然后您可能希望使用随机算法运行它 --- 同时运行非随机算法作为备份。

(好吧,你可能想知道为什么氧气调节器想知道特定数字是否是素数。也许它需要与医疗计算机网络通信,并且出于医疗隐私原因,通信需要安全......)

【讨论】:

    【解决方案2】:

    当我们说“预期运行时间”时,我们指的是平均情况下的运行时间。我们可能在谈论渐近的上限或下限(或两者兼而有之)。同样,我们可以讨论最佳或最坏情况的运行时间的渐近上限和下限。换句话说,边界与案例正交。

    在随机快速排序的情况下,人们谈论预期的运行时间 (O(n log n)),因为这使得算法看起来比最坏情况的 O(n^2) 算法更好(虽然不是在最坏的情况下渐近)。换句话说,随机快速排序比例如快得多。几乎所有输入的冒泡排序,人们想要一种方法来明确这一事实;所以人们强调随机快速排序的平均运行时间,而不是在最坏情况下它像冒泡排序一样渐近糟糕。

    正如在 cmets 和 Greg 的出色回答中所指出的,关于在固定的任意输入上执行算法期间做出的随机选择序列集,通常会谈论预期的运行时间。这可能更自然,因为我们认为输入是由主动算法被动地作用的。事实上,这相当于说随机输入的平均值和执行不考虑结构差异的算法。这两种公式都比输入和随机选择对的真实平均值更容易可视化,但无论您采用哪种方法,您都会得到相同的答案。

    【讨论】:

    • 这是否意味着即使是随机快速排序的最坏情况时间也是 O(n^2)??
    • @vincentmathew 取决于您所说的最坏情况。另请参阅下面格雷格的回答。基本上,如果你只考虑预期的硬币翻转,它是 O(n log n)。如果您考虑最坏情况下的硬币翻转,那么它是 O(n^2),而且是一个丑陋的。对您而言,案例的构成要素是:随机实例上的单次执行,还是该实例上多次执行的平均值?
    • 我认为这个答案不是很准确。我觉得stackoverflow.com/a/7898295/3924118的答案比较准确。
    • @nbro 已解决。
    【解决方案3】:

    如果算法的行为不仅取决于其输入,还取决于随机数生成器产生的值,则该算法是随机的。 这就是您分析预期结果的原因。

    仅对输入进行最坏情况分析。

    【讨论】:

      【解决方案4】:

      有点晚了,这更像是一个长评论,但我认为这是很重要的补充。任何具有预期时间 T 的算法都可能成为最坏情况 O(T) 算法,马尔可夫不等式告诉我们,如果预期时间为 T,那么至少有 1/2 的概率该算法将需要少于 2T 次操作,所以我们可以运行算法,如果它需要超过 2T 的操作,我们停止并重新运行它,最多执行 log(1/delta) 次将使我们最多失败的概率为 delta。所以我们得到一个时间复杂度 O(T*log(1/delta)) 和失败概率增量。但是由于 log 非常小,这实际上是一个失败概率为 0 的 O(T) 算法。例如,如果我们选择 delta 作为从可观察宇宙中随机选择的 2 个原子与我们得到 log 相同的原子的概率(1/delta)=260 所以我们可以说我们得到 O(T) 失败概率为 0。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-10
        • 2015-07-10
        • 2011-11-29
        • 2013-06-03
        • 2011-05-09
        相关资源
        最近更新 更多