假设我们要分析算法的运行时间。有时我们说我们想在输入大小为n时找到算法的运行时间,在最坏的情况下用O(n)表示它。有时,尽管我看到书籍/论文说我们需要找到算法的预期时间。有时也使用平均运行时间。
什么是“预期时间”?在什么情况下找到期望的时间而不是最坏的情况有用?
编辑:我认为预期的运行时间和平均运行时间之间存在细微的差别,但我不确定。通过这篇文章,我想知道确切的区别。
假设我们要分析算法的运行时间。有时我们说我们想在输入大小为n时找到算法的运行时间,在最坏的情况下用O(n)表示它。有时,尽管我看到书籍/论文说我们需要找到算法的预期时间。有时也使用平均运行时间。
什么是“预期时间”?在什么情况下找到期望的时间而不是最坏的情况有用?
编辑:我认为预期的运行时间和平均运行时间之间存在细微的差别,但我不确定。通过这篇文章,我想知道确切的区别。
Answers:
预计时间只是平均水平,预计,运行使用该算法的时间预期的输入。
假设您有几百万条用户记录并希望对其进行排序,那么您可能想要使用最适合您的输入的算法,从而提供最佳的预期运行时间,而不是具有更好的算法最坏的情况下运行时间,但预期的运行时间更糟。
有时,例如,算法时间复杂度的常数因数很高,以至于使用时间复杂度较差但常数因数较小的算法是有道理的,因为即使输入较少,它也可以为您提供更好的预期运行时间在更大的投入下表现惊人。
也许更好的例子是经典的快速排序算法,该算法在最坏情况下的运行时间为O(n²),但与输入无关,其预期的平均运行时间为O(n log n)。这是因为算法使用(或更确切地说,可能使用,取决于实现方式)随机化。这就是所谓的随机算法。即使使用相同的输入,每次调用的运行方式也有所不同。这样,实现中就没有通用的最坏情况输入,因为最坏情况输入取决于算法选择划分给定输入的枢轴的方式。因此,不能仅仅提供一些预定义的输入,从而导致最坏的运行时间。随机算法经常会出现这种情况,该算法旨在获得更好的预期平均运行时间,而与输入无关。
这一切都是针对手头的输入使用正确的算法。
就像最坏情况下的运行时间一样,随机算法的预期运行时间是一个定义明确的概念。如果算法是随机的,则其运行时间也是随机的,这意味着我们可以定义其运行时间的期望值。
一个著名的例子是Quicksort:如果我们随机选择枢轴,即使最坏的运行时间仍为O(n ^ 2),我们也可以证明其预期的运行时间为O(n log n)。一个随机函数非常有效的例子是最小的圆环问题:有一个简单的算法,其最坏情况下的运行时间为O(n ^ 3),但可以预料的是,其运行时间仅为O(n)。
在谈论“对于大多数输入”算法的行为时,通常使用平均运行时间。我们定义了某种随机生成输入的方式,例如,用随机数填充数组,或者随机排列数字1到n(因此没有重复项),或者翻转硬币并得到一组降序或升序数字。那么,针对该输入的随机分布的算法的平均运行时间就是该算法的预期运行时间(在这种情况下,该算法可能不会被随机化,但是输入是随机的)。
举个例子:存在几何问题,对于这些几何问题,乍看之下似乎效果很好,直到您发现某种非常奇怪的分配输入线的方法为止。如果您假设这些线是随机分布的,那么可能很可能不会出现这些怪异的情况,因此您的算法最终是好的。
对比:预期的运行时间与算法的执行情况有关,除非运气不佳-在相同的输入上重试相同的算法,但使用不同的随机选择可能会更快地解决该问题。平均运行时间讨论的是算法对“大多数输入”的执行效果如何-在相同的输入上再次尝试相同的算法不会对您有所帮助(除非算法也被随机化了)。