我正在研究随机快速排序算法。我意识到这个算法的运行时间总是表示为“预期运行时间”。
指定或使用“预期运行时间”的原因是什么?我们为什么不计算最坏情况或平均情况?
答案 0 :(得分:7)
有时,预期的运行时间是指随机选择的输入的平均运行时间。但是,如果它是一个随机算法,那么通常意味着对于每个输入,算法对随机选择的预期运行时间。这就是这里的意思。对于n个项目的每个输入,随机快速排序平均在时间O(n(log n))中运行,仅在其硬币翻转时平均。
在这种有限的意义上,预期的运行时间是一种非常可靠的衡量随机算法运行时间的方法。如果您只担心算法在内部翻转硬币时可能发生的最坏情况,那么为什么还要费心翻转硬币呢?你不妨让他们全部成为头脑。 (在随机快速排序的情况下,将其减少到普通快速排序。)
平均情况与最坏情况相比是一个更严重的问题,当它是平均输入而不是平均超过硬币翻转时。在这种情况下,平均运行时间充其量只是一个不适应输入类型变化的数字 - 算法的不同用途可能有不同的输入分布。我说充其量只是因为你可能不知道输入的假设分布是真正的用法。
关于硬币翻转的最糟糕的情况只有当你想要在你的硬币翻转并不运气时快速奔跑时才有意义,而且即使你的硬币翻转不运行也不会太慢。例如,假设您需要一个用于氧气供应的调节器的排序算法(对于医疗患者或潜水员)。然后,随机化的快速排序只有在你希望结果通常非常快的时候才会有意义,为了方便用户,并且如果最坏的情况不会让用户窒息,无论如何。这是一种用于排序算法的设计方案,因为有非随机排序算法(如合并排序),即使平均也不比快速排序慢得多。对于诸如素性测试之类的问题,它的设计较少,其中随机算法比非随机算法 更快。然后你可能想用随机算法运行它 - 同时运行非随机算法作为备份。
(好吧,你可能想知道为什么氧气调节器会想知道特定的数字是否是素数。也许它需要与医疗计算机网络通信,并且出于医疗隐私的原因,通信需要是安全的......)< / p>
答案 1 :(得分:5)
当我们说“预期运行时间”时,我们正在讨论平均情况的运行时间。我们可能正在讨论渐近上限或下限(或两者)。同样,我们可以讨论最佳或最差情况的运行时间的渐近上限和下限。换句话说,边界与案例正交。
在随机快速排序的情况下,人们谈论预期的运行时间(O(n log n)),因为这使得算法看起来比最坏情况的O(n ^ 2)算法更好(尽管不是在最坏的情况下渐近)。换句话说,随机化快速排序比例如Bubblesort几乎所有投入,人们想要一种方法来明确这一事实;所以人们强调随机快速排序的平均情况运行时间,而不是在最坏的情况下它像Bubblesort一样渐渐变坏。
正如评论和Greg的优秀答案所指出的那样,对于在算法在固定的任意输入上执行期间所做的随机选择序列集的预期运行时间也可能是常见的。这可能更自然,因为我们认为输入被主动算法被动地操作。实际上,它相当于说随机输入的平均值和执行不考虑结构差异的算法。这两种公式比输入和随机选择对的真实平均值更容易可视化,但无论您采用哪种方式,都可以获得相同的答案。
答案 2 :(得分:3)
如果算法的行为不仅取决于其输入,还取决于随机数生成器生成的值,则算法是随机化的。 这就是你分析预期的原因。
最坏情况分析仅在输入上。
答案 3 :(得分:0)
有点晚了,它更像是一个长评论,但我认为这是很重要的补充。任何预期时间为 T 的算法都可能成为最坏情况 O(T) 算法,马尔可夫不等式告诉我们,如果预期时间为 T,那么该算法至少有 1/2 的概率将需要少于 2T 次操作,所以我们可以运行算法,如果需要超过 2T 次操作,我们停止并重新运行它,这样做最多 log(1/delta) 次将使我们失败的概率最多为 delta。所以我们得到一个时间复杂度为 O(T*log(1/delta)) 的故障概率为 delta。但由于 log 太小,出于所有实际原因,这是一个 O(T) 算法,失败概率为 0。例如,如果我们选择 delta 作为概率,从可观测宇宙中随机选择的 2 个原子将是同一个原子,我们得到 log (1/delta)=260 所以我们可以说我们得到 O(T),失败概率为 0。