摊销成本,平均成本和预期成本之间的差异

时间:2016-03-24 08:40:57

标签: algorithm

我在学习算法。摊销成本,平均成本和预期成本之间有什么区别?

1 个答案:

答案 0 :(得分:7)

算法的平均成本实际上是基于算法可能处理的每种可能情况的平均成本,并将其除以所述情况的数量。如果算法可以在x,2x,3x和4x时间内对4个不同的输入A,B,C,D起作用,那么它的平均成本就是;

(x + 2x + 3x + 4x) / 4 = 2.5 * x.

预期成本与平均成本相似,但它也考虑了输入发生的可能性。基于上面的相同例子,如果算法输入A,B,C和D的概率分别为0.5,0.3,0.1,0.1,那么预期成本将是;

(0.5 * x + 0.3 * 2x + 0.1 * 3x + 0.1 * 4x) = 1.8 * x.

摊销成本与上述两个概念略有不同。传统上,当计算平均,最坏情况和预期时间成本时,我们将每个操作视为单个等效步骤,并基于这些操作的总数计算算法的复杂性。然而,通过摊销分析,没有假设每个操作都是等效的。 (即大致等量的时间)一个很好的例子就是在大多数编程语言中实现动态分配的数组实现。

采用STL的C ++和std :: vector。它以容量和大小0开始。当你尝试将一个元素推到它上面时,它会分配一个1的数组,容量和大小变为1.当你再次这样做时,容量和大小变为2.下一次但是,即使大小增加1,容量也会变为4.当你填充4的容量时,在调整大小时,容量变为8,当填充时,它在必要时调整为16。

此模式的要点表明,对std :: vector的每次插入都不会花费相同的时间来执行,因为在某些插入中需要调整内部保持的数组的大小。然而,随着容量的增加,矢量容量的增加量变得足够大,使得插入时调整大小的概率降低到我们实际上仍然考虑插入这样的动态阵列以具有恒定时间成本的水平。这是由于摊销分析。

通过摊销分析,您可以考虑昂贵的操作的频率和成本及其与执行操作总数的比率,而不是考虑每个操作花费相同的时间,并找出更好的结果方式是某些算法所花费的实际时间。

例如在std :: vector实现中,如果你对空向量进行n次插入,那么只会有logn昂贵的向量。 (即需要调整大小)并且当考虑比率时,结果是恒定时间操作。