5

add(index,E)我想知道java 方法的运行时间是多少ArrayList。根据javadoc,添加操作的运行时间是摊销的O(1)。但是在add(index,E)的描述中它说。

在此列表中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将其索引加一)。

所以它看起来像O(N)。我想知道如果此操作的运行时间是使O(1). 是否可以进行任何摊销工作来进行此操作O(1)并为其他操作牺牲运行时间?

我读到javaArrayList是由数组支持的,改变数据结构会有帮助吗?

4

2 回答 2

3

ArrayList对于添加/删除的任意索引具有 O(n) 时间复杂度,但对于列表末尾的操作具有 O(1) 时间复杂度。更接近O(1) 查找意味着可能类似于以索引为键、元素为值的哈希表支持的数据结构。再次插入将花费 O(n) 时间,因为它会触发调整大小。

于 2013-06-20T05:22:51.347 回答
2

一个简单的数组支持列表的实现将复制每个要在插入上移动的项目作为单独的操作。幸运的是,要移动的字节在内存中都是连续的,并且每个操作系统都支持在单个快速操作中有效地复制大块内存。

所以插入数组的中间并不像你想象的那么糟糕。当然,如果您的应用程序具有正确的访问模式,将数据结构更改为链表可能会更快。

于 2013-06-20T05:24:57.403 回答