使用ArrayList解释摊销时间的概念?n数组列表的插入运行时间是O(n)



请用一个简单的问题来解释

我读过一本书,书中说ArrayList在达到极限后会翻倍,如果ArrayList已满,则插入N元素需要O(N)插入时间。请以的少数元素的阵列列表进行解释

用简单的术语解释的摊销时间:

如果你做了一百万次手术,你并不真正关心手术的最坏情况或最好情况——你关心的是当你重复一百万次手术时总共需要多少时间。

因此,偶尔操作是否非常缓慢并不重要,只要"偶尔"的情况足够罕见,可以淡化缓慢。从本质上讲,摊销时间意味着"如果你做了很多次手术,每次手术所花费的平均时间"。摊销时间不一定是恒定的;你可以有线性和对数摊销时间或其他任何东西。

让我们以一个动态数组为例,您可以向其中重复添加新项。通常添加一个项目需要恒定的时间(即O(1))。但是,每次阵列满了,就会分配两倍的空间,将数据复制到新区域,并释放旧空间。假设在恒定时间内分配和释放运行,则此放大过程需要O(n)时间,其中n是数组的当前大小。

因此,每次放大所花费的时间大约是上次放大的两倍。但你也等了两倍的时间才这么做!因此,每次放大的成本可以在插入之间"分摊"。这意味着,从长远来看,将m个项目添加到数组所花费的总时间为O(m),因此摊销时间(即每次插入的时间)为O(1)。

最新更新