什么是算法的摊销分析?

时间:2012-06-19 13:58:11

标签: algorithm analysis amortized-analysis

它与渐近分析有什么不同?你什么时候使用它,为什么?

我读过一些似乎写得很好的文章,比如:

但我仍然没有完全理解这些概念。

那么,有人可以为我简化吗?

7 个答案:

答案 0 :(得分:79)

对于一次调用,摊销分析并不会天真地将调用次数与最坏情况相乘。

例如,对于需要时大小翻倍的动态数组,正态渐近分析只能得出结论,向其中添加项目需要花费O(n),因为它可能需要增长并将所有元素复制到新数组。摊销分析考虑到为了必须增长,必须添加n / 2项而不会导致自上一次增长以来增长,因此添加项目实际上只需要O(1)(O(n)的成本是通过n / 2次操作分摊

摊销分析与“平均绩效”不同 - 摊销分析给出了硬保证,如果你做了这么多的行动,表现将会做什么。

答案 1 :(得分:41)

“什么”有很多答案,但没有“为什么”。

正如其他人所说,渐近分析是关于给定操作的性能如何扩展到大型数据集。摊销分析是关于大型数据集上所有操作的平均性能如何扩展。摊销分析决不会比渐近分析更糟糕,有时会提供更好的分析。

如果您担心较长工作的总运行时间,那么摊销分析的更好界限可能就是您关心的问题。这就是为什么脚本语言(例如)通常很乐意通过某种因素来增长数组和哈希表,即使这是一项昂贵的操作。 (增长可以是O(n)操作,但是摊销是O(1)因为你很少这样做。)

如果您正在进行实时编程(个别操作必须在可预测的时间内完成),那么摊销分析的更好界限无关紧要。如果平均操作速度很快,如果你没能及时完成并且在切割太远之前调整带锯,那就无关紧要了......

在您的情况下哪一个问题取决于您的编程问题究竟是什么。

答案 2 :(得分:23)

渐近分析

这个术语指的是算法性能的分析,假设算法运算的数据(输入)是外行的术语,“足够大,使其变大不会改变结论”。虽然不需要指定输入的确切大小(我们只需要一个上限),但数据集本身必须指定

请注意,到目前为止,我们只讨论了分析的方法;我们没有准确指出我们正在分析的数量(时间复杂度?空间复杂度?),我们也没有指定我们感兴趣的指标(最坏情况?最佳情况) ?平均?)。

在实践中,术语渐近分析通常是指算法的上限时间复杂度,即由总运行时间测量的最坏情况性能,由大哦符号表示(例如a排序算法可能是O(nlogn))。

摊销分析

这个术语指的是基于针对最坏情况场景的特定操作序列的算法性能分析 - 也就是说,摊销分析确实意味着该度量标准是最坏情况下的性能(尽管它仍然没有说明正在测量的数量)。要执行此分析,我们需要指定输入的 size ,但我们不需要对其形式做任何假设。

用外行人的话来说,摊销分析是为输入挑选任意大小,然后“通过”算法。每当必须作出取决于输入的决定时,最坏的路径是¹。算法运行完成后,我们将计算的复杂度除以输入的大小,以产生最终结果。

¹note:确切地说,理论上可能的最差路径 。如果每次容量耗尽时都有一个动态加倍的向量,“最坏情况”并不意味着假设它需要在每次插入时加倍,因为插入被处理为一个序列。我们被允许(并且确实必须)使用已知的状态以数学方式消除尽可能多的“更糟糕”的情况,即使输入仍然未知。

最重要的区别

渐近分析和摊销分析之间的关键区别在于前者依赖于输入本身,而后者依赖于算法将执行的操作序列。

因此:

  • 渐近分析允许我们断言算法的复杂性,当给出接近N 的大小的最佳/最差/平均情况输入时,由某个函数F(N)限制 - 其中N是变量
  • 摊销分析允许我们断言算法的复杂性,当它被赋予未知特征的输入但已知大小N不比函数F(N)的值差 - 其中N是已知值

答案 3 :(得分:12)

对此的答案由“算法导论”一书中的“摊销分析”一章的第一句简洁定义:

  

摊销分析中,执行序列所需的时间   数据结构操作是对所有操作的平均值   进行。

我们通过渐近分析来表示程序增长的复杂性 - 这是通过函数限制程序的增长并定义最差,最佳或平均情况。

但是,如果只有一个案例的复杂性达到峰值,那么这可能会产生误导,但总的来说,程序并不需要太多的计算。

因此,即使单个操作可能很昂贵,在一系列操作中平均成本也更有意义。这是摊销分析!

摊销分析是用于计算复杂性的渐近技术的替代方法。它有助于我们在实用性方面计算更真实的复杂性,从而比较和决定两种或更多算法。

答案 4 :(得分:5)

迄今为止我发现的最佳参考资料,用于理解算法的摊销分析,在书Introduction to Algorithms,第三版,第17章:“摊销分析”中。它就在那里,比Stack Overflow帖子中的内容要好得多。你会在任何体面的大学图书馆找到这本书。

答案 5 :(得分:2)

常规渐近分析根据问题的大小渐近地查看单个操作的性能。 O()符号表示渐近分析。

分摊分析(也是渐近分析)着眼于共享数据结构上多个操作的性能。

不同之处在于,摊销分析通常证明M操作所需的总计算比单个操作的最坏情况的M倍具有更好的性能保证。

例如,大小为N splay tree的单个操作可能需要O(N)时间。然而,在大小为N的树上的M个操作序列由O(M(1 + log N)+ N log N)时间限定,其大致为每个操作O(log N)。但请注意,摊销分析比“平均情况”分析严格得多:它证明任何可能的操作序列都将满足其渐近最坏情况。

答案 6 :(得分:1)

摊销分析涉及常规运行的总成本,以及可在其中获得的收益。例如,搜索n个项目的未排序数组以进行单个匹配可能需要进行n次比较,因此是o(n)复杂度。但是,如果我们知道要搜索m个项目的相同数组,则重复总任务将具有复杂度O(m * n)。但是,如果我们预先对数组进行排序,则成本为O(n log(n)),并且连续搜索仅对排序数组采用O(log(n))。因此,采用这种方法的m个元素的总摊销成本是O(n * log(n)+ m * log(n))。如果m> = n,则与O(n ^ 2)相比,这通过预排序等于O(n log(n))以进行不排序。因此,摊销成本更便宜。

简单地说,通过稍早花一点时间,我们可以节省很多。