什么是摊销分析?它如何帮助我在我的程序中实现最坏的性能保证?
我是阅读,认为以下技术可以帮助程序员实现最坏的性能保证(用我自己的话说:保证程序的运行时间不会超过最坏的情况下的运行时间):
作者将调整数组数据结构作为如何实现摊销分析的一个例子,但我仍然不明白什么是摊销分析,以及如何实现它(数据结构?算法?)以达到最差的性能保证
发布于 2012-08-18 08:31:49
你不执行摊销分析。这是一种获得更精确的O边界的技术。
你必须要做的基本观察是,昂贵的手术不可能在任何时候发生。
在数组支持的数据结构中,数组需要不时调整大小--当它已满时。这是最昂贵的操作,需要O(n)时间。数组中的所有其他插入都是O(1)。
要确定插入n项的运行时,可以将n与最昂贵的操作O(n)相乘,这将导致O(n^2)的总体运行时行为。
然而,这是不准确的,因为调整大小不可能经常发生。
当你谈到钱,你摊销成本,当你偿还你的债务与多次小付款随着时间的推移。
我们也可以用这个模型来考虑算法。我们只需将“时间”替换为“金钱”,以避免心理映射。
一旦数组达到它的长度n,我们就可以使它的大小翻倍。我们需要进行以下操作:
2n内存块n项目如果我们假设分配内存和复制都发生在线性时间,这将是一个非常昂贵的操作。然而,我们现在可以利用债务的概念并将其摊销用于我们的分析。只是,我们要先摊还我们的债务,然后才能还清。
让我们假设,一旦我们调整了数组的大小,我们的余额(货币/时间)就会回到0(即我们没有债务,也没有任何剩饭)。
这意味着:
n项将支付调整大小和复制的费用(我们有n使用的插槽,以及n未使用的时隙)现在,我们可以考虑每个insert操作需要支付多少费用:
我们现在已经支付了分配内存、复制和插入下一个n元素的费用。然而,我们还忽略了为旧的n元素分配空间以及复制它们。
我们只需将旧n元素的成本分配给新的(尚未插入) n元素:
总共,每一次插入操作将花费5个单元。这为它自己的插入,以及移动和分配空间为自己和旧元素之一付出了代价。
每个insert-操作仍然需要固定的时间,但是调整大小是免费的:我们通过在每个插入上花费“更多”时间来摊销它。
因此,插入n元素需要O(n)时间。
摊销分析的其他技术是在此解释。
发布于 2012-08-18 06:09:31
首先,它是一种分析程序运行时的技术,而不是算法的实现技术。
列表中提到的示例是一个很好的例子:将单个项附加到数组支持的数据结构中。对于每一个附加操作,最坏的情况是必须复制所有现有的项目。这种分析太悲观了,因为如果您使用的是合理的调整大小策略(将大小乘以x> 1.0),则不必这样做。然后分析说,您有一个O(n^2)绑定--每项O(n)乘以n项--而实际运行时仅为O(n)。
如果对插入的所有项目(其中大多数不需要调整大小)进行调整成本的平均值,则需要进行摊销分析。摊销分析的结果是一个O(n)界,与算法的实际行为相吻合。
https://softwareengineering.stackexchange.com/questions/161404
复制相似问题