【发布时间】:2011-10-25 21:26:49
【问题描述】:
我正在研究随机快速排序算法。我意识到这个算法的运行时间总是表示为“预期运行时间”。
指定或使用“预期运行时间”的原因是什么?我们为什么不计算最坏或平均情况?
【问题讨论】:
标签: algorithm random quicksort asymptotic-complexity
我正在研究随机快速排序算法。我意识到这个算法的运行时间总是表示为“预期运行时间”。
指定或使用“预期运行时间”的原因是什么?我们为什么不计算最坏或平均情况?
【问题讨论】:
标签: algorithm random quicksort asymptotic-complexity
有时,预期运行时间是指随机选择的输入的平均运行时间。但是,如果它是一个随机算法,那么通常意味着对于每个输入,该算法做出的随机选择的预期运行时间。这就是这里的意思。对于 n 个项目的每个输入,随机快速排序平均运行时间为 O(n(log n)),仅在其掷硬币时取平均值。
在这种有限的意义上,预期运行时间是随机算法运行时间的一个非常合理的衡量标准。如果您只担心算法在内部翻转硬币时可能发生的最坏情况,那么为什么还要费心翻转硬币呢?你不妨把它们都变成头。 (在随机快速排序的情况下,会将其简化为普通快速排序。)
平均情况与最坏情况是一个更严重的问题,当它是输入的平均值而不是硬币翻转的平均值时。在这种情况下,平均运行时间充其量只是一个不适应输入类型变化的数字——算法的不同用途可能有不同的输入分布。我说充其量是因为您可能不知道输入的假设分布才是真正的用法。
只有当你既想在抛硬币不倒霉时跑得快,又想在抛硬币倒霉时跑得太慢时,才考虑抛硬币的最坏情况。例如,假设您需要一个用于氧气供应调节器的排序算法(用于医疗患者或水肺潜水员)。那么随机快速排序只有在你们都希望结果通常非常快时才有意义,为了用户的方便,并且如果最坏的情况无论如何都不会让用户窒息。这是排序算法的人为场景,因为有非随机排序算法(如归并排序)并不比快速排序慢很多,甚至平均而言。对于像素数测试这样的问题,随机算法比非随机算法快远快。然后您可能希望使用随机算法运行它 --- 同时运行非随机算法作为备份。
(好吧,你可能想知道为什么氧气调节器想知道特定数字是否是素数。也许它需要与医疗计算机网络通信,并且出于医疗隐私原因,通信需要安全......)
【讨论】:
当我们说“预期运行时间”时,我们指的是平均情况下的运行时间。我们可能在谈论渐近的上限或下限(或两者兼而有之)。同样,我们可以讨论最佳或最坏情况的运行时间的渐近上限和下限。换句话说,边界与案例正交。
在随机快速排序的情况下,人们谈论预期的运行时间 (O(n log n)),因为这使得算法看起来比最坏情况的 O(n^2) 算法更好(虽然不是在最坏的情况下渐近)。换句话说,随机快速排序比例如快得多。几乎所有输入的冒泡排序,人们想要一种方法来明确这一事实;所以人们强调随机快速排序的平均运行时间,而不是在最坏情况下它像冒泡排序一样渐近糟糕。
正如在 cmets 和 Greg 的出色回答中所指出的,关于在固定的任意输入上执行算法期间做出的随机选择序列集,通常会谈论预期的运行时间。这可能更自然,因为我们认为输入是由主动算法被动地作用的。事实上,这相当于说随机输入的平均值和执行不考虑结构差异的算法。这两种公式都比输入和随机选择对的真实平均值更容易可视化,但无论您采用哪种方法,您都会得到相同的答案。
【讨论】:
如果算法的行为不仅取决于其输入,还取决于随机数生成器产生的值,则该算法是随机的。 这就是您分析预期结果的原因。
仅对输入进行最坏情况分析。
【讨论】:
有点晚了,这更像是一个长评论,但我认为这是很重要的补充。任何具有预期时间 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。
【讨论】: