3

我正在阅读Cracking the Coding Interview,在Big O一章中,有关于Amortized Time的解释。此处使用了需要增长的诸如 ArrayList 之类的经典示例。当一个数组需要增长时,O(N)假设它必须将 N 个元素复制到新数组中,插入将需要时间。这可以。

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

4

1 回答 1

8

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

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

如果您溢出可用空间,则仅追加是昂贵的。然后你必须分配一个更大的区域,移动整个数组,并删除前一个。这是一个O(n)操作。但是,如果我们只是每次都这样做O(1/n),那么平均而言,它仍然可以达到O(n * 1/n) = O(1).

平均值是否重要取决于您的任务。如果您正在控制重型机械,那么在单个操作上花费太长时间可能意味着您无法尽快回到旋转的刀片上,这可能是官方错误的。如果您正在生成一个网页,那么重要的是一系列操作所花费的总时间,这将是操作次数乘以每个操作的平均时间。

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

于 2017-08-31T04:29:27.963 回答