了解摊销时间以及为什么数组插入为O(1)

时间:2017-08-31 02:06:39

标签: algorithm big-o amortized-analysis

我正在阅读Cracking the Coding Interview,在Big O章节中,有一个关于摊销时间的解释。这里使用了诸如ArrayList需要增长的经典示例。当阵列需要增长时,假设必须将N个元素复制到新阵列,插入将花费O(N)时间。这很好。

我不明白的是,由于数组的容量增加了一倍,为什么每次插入的摊还时间为O(1)从我理解的一切,无论何时插入数组,它始终是O(N)操作。O(1)摊销时间有何不同?我确定文字是正确的,我只是不了解node摊销的时间概念。

1 个答案:

答案 0 :(得分:5)

我正在回答你似乎感到困惑的问题,而不是你正式问的问题。

您真正的问题是如何追加O(1)操作。如果已经为数组的下一个元素分配了空间,则追加只是更新有多少元素的记录,并复制该条目。这是O(1)操作。

如果溢出可用空间,则仅追加是昂贵的。然后你必须分配一个更大的区域,移动整个数组,并删除前一个。这是O(n)操作。但是,如果我们每{{}}}次仅执行此操作,那么在平均值上,它仍然会出现在O(1/n)

平均事项是否取决于您的任务。如果你控制重型机械,在个别操作上花费太长时间就意味着你不能很快回到旋转叶片上,这可能是正式的。如果您正在生成一个网页,那么重要的是一系列操作所需的总时间,这将是操作次数乘以每个操作的平均时间。

对于大多数程序员来说,平均值才是最重要的。