2012-02-18 115 views
2

这是从维基百科:http://en.wikipedia.org/wiki/Arraylist性能。 ArrayList:remove(),add()在数组末尾的时间,add(),remove()在开始的线性时间。java列表处理时间

LinkedList:两种操作均表示:恒定时间,索引:线性。


1)为什么在两个操作之间arraylist处理时间的区别?

2)Linkedlist对于索引是线性的,对于最后添加常量,为什么?

回答

1

当你addArrayList的末尾时,它会自我增长以留出一些空间。所以如果你有一个十个元素ArrayList,在最后添加将导致它在内部为二十个元素分配空间,复制你已有的十个元素,然后添加一个元素。然后,当你在最后添加另一个元素时,它会将第十二个元素粘贴到它已经创建的空间中。

这在技术上并没有给它在最后的固定时间插入,但它确实给它分期付款固定时间插入。也就是说,在大量的运营中,成本接近恒定的时间;每次增长时,它都会增加一倍,因此在必须再次进行增长和复制之前,您将拥有数量更多的“免费”常量插入。

当您在开始插入时,它不能这样做,并且必须始终将整个列表复制到新位置(线性时间)。

因为您只是将最后一个单元格从“已填充”切换到“可用空间”,所以从最后移除始终是恒定时间。你永远不需要复制列表。

至于你的第二个问题,一个LinkedList保持一个指针到列表的末尾,所以addremove那里只是使用该指针,因此是恒定的时间。在列表中间没有快速指针,因此访问任意元素需要从开始到(可能)结束的线性时间遍历。

3

1)因为要在开始时添加/删除它必须移动所有内容并重新索引。

2)因为它保持对头部和尾部的引用(开始&结束)。索引意味着遍历列表。

1

i)ArrayList - >在开始时删除/添加的情况下,您必须将所有元素推到一个位置,因此需要线性时间。在数组的末尾,您只需添加或删除。 ii)LinkedList - >你有头部和尾部的引用,因此你可以在那里添加/删除任何东西(在不变的时间内)。

1
  1. 因为在最后删除不需要移动数据。添加可能需要复制来调整存储阵列的大小,但是现在是摊销
  2. 因为在最后添加并不需要走列表,但索引。