对于Java ArrayList,准确地说是通过索引运行在分摊的常量时间中添加和删除,这意味着平均来说它是恒定时间(在极少数情况下,通过设置内存使线性时间更长,以便将来的操作更快)?
答案 0 :(得分:0)
对于add(Object)
是,但对于remove(int index)
,只有在您移除最后一个元素时,它才是常量时间,否则元素会被移动以移除任何nulls
从数组的中间开始。
基于指数的add
(并且从最后一个位置移除)不会按照常规时间摊销,它们是线性时间。
答案 1 :(得分:0)
不可以说,通过索引从ArrayList
插入和删除元素是按照常量时间摊销是不准确的,因为没有用于复制数据的分期付款。
仅列出扩展及其关联的复制是分摊的,因为它们不经常发生 * 。但是,这需要在列表末尾插入。
当您在列表的开头插入时,扩展仍然会摊销,但是每次调用都会将元素移动1位所需的副本,并且不已分摊。
* 为了能够分摊运营成本,您需要混合使用“便宜”和“昂贵”的操作。在这种情况下,您可以在所有操作中分摊总成本,从而获得较低的结果。