我想知道java add(index,E)
的{{1}}方法的运行时间是多少。根据{{3}},添加操作的运行时间是摊销ArrayList
。但在javadoc的描述中,它说的是。
将指定元素插入此列表中的指定位置。 移动当前位于该位置的元素(如果有)和任何元素 右边的后续元素(在索引中加一个)。
所以它看起来像O(1)
。我想知道我们要交易什么,如果这个操作的运行时间是O(N)
。是否有任何摊销工作可以完成此操作O(1)
并牺牲其他操作的运行时间?
我读过java O(1)
是由数组支持的,会改变数据结构的帮助吗?
答案 0 :(得分:3)
ArrayList
对于任意添加/删除索引具有O(n)时间复杂度,但对于列表末尾的操作具有O(1)。 更接近到O(1)查找意味着可能是类似于Hash Table支持的数据结构,索引为键,元素为值。再次插入将花费O(n)时间,因为它会触发调整大小。
答案 1 :(得分:2)
数组支持列表的简单实现会将要在插入上移动的每个项目复制为单独的操作。幸运的是,要移动的字节在内存中都是连续的,并且每个操作系统都支持在单个快速操作中有效地复制大块内存。
因此插入数组的中间并不像你想象的那么糟糕。当然,如果您的应用程序具有正确的访问模式,则将数据结构更改为链接列表可能会更快。