我如何在O(1)(摊销)中执行此任务?

时间:2017-06-11 02:37:21

标签: c++ algorithm big-o

我只是想与某人确认我在继续前的正确轨道上。问题表明,当我想在已经完成的数组中添加一个新元素时,我必须"在O(1)(摊销)"中展开数组。

这是说每次我将一个新元素插入一个完整的列表,我应该添加5个元素或类似的元素,这样每次添加新元素时我都不必执行扩展吗?

2 个答案:

答案 0 :(得分:7)

  

这是说每次我将一个新元素插入一个完整的列表中我应该添加5个元素或类似的东西,所以每次添加一个新元素时我都不必执行扩展吗?

排序。但任何常量数量的额外插槽都会遇到同样的问题:即使你只需要每五次插入一次复制到一个新数组,它仍然平均为O( n )每次插入的时间,因为O( n / 5 )= O( n )。

相反,您需要添加一些与当前数组大小成比例的插槽。最简单的方法是在需要增长时将数组大小加倍,平均为O( n / n )= O(1);但是将它增加(例如)50%或任何其他恒定比例会产生同样的效果。

答案 1 :(得分:3)

当然它可能取决于您的编译器/操作系统,但其标准是:

1. Allocate a new buffer with size 50 percent larger than the current buffer size
2. Copy the data from the current buffer to the new buffer.
3. Perhaps fiddle with addresses so the new buffer replaces the old buffer.  

所以这需要O(1)