数组列表操作的运行时间按索引添加和删除
这个问题在这里已经有了答案:
不,这是不准确的,因为索引中ArrayList
中元素的插入和删除是分摊恒定时间,因为没有摊销进行数据复制。
只有扩展名列表和它们相关的拷贝才会被分摊,因为它们很少发生*。 但是,这需要在列表末尾插入。
当您在列表的开头插入时,扩展仍然会摊销,但每次调用都需要将元素移动1个位置所需的副本,且不会摊销。
*为了能够分摊操作成本,您需要混合使用“便宜”和“昂贵”操作。 在这种情况下,您可以将所有操作的总成本分摊,从而获得较低的结果。
对于add(Object)
是的,但对于remove(int index)
,只有当你删除最后一个元素时,它才是常量时间,否则元素将被移动以从数组中移除任何nulls
。
基于索引的add
(以及从不是最后一个位置移除)不是摊销常量时间,它们是线性时间。
上一篇: Runtime of arraylist operations add and remove by index