【问题标题】:what is the running time for insertion of an element at some index of arrayList?在arrayList的某个索引处插入元素的运行时间是多少?
【发布时间】:2013-06-20 05:18:46
【问题描述】:

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

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

所以它看起来像O(N)。我想知道如果这个操作的运行时间是使O(1) ,我们必须换取什么。是否可以进行任何摊销工作来进行此操作O(1) 并为其他一些操作牺牲运行时间?

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

【问题讨论】:

标签: java data-structures arraylist complexity-theory big-o


【解决方案1】:

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

【讨论】:

  • 你指的是哪个查找操作有O(1)时间?
  • 你的意思是当你说查找时添加?
【解决方案2】:

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

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

【讨论】:

  • 将数据结构更改为链表有什么帮助?如果 O(1) 同意,则在链表中插入,但是找到插入的位置可能需要 O(N) 所以这不会破坏我们的目的吗?
  • 因此需要注意“如果您的应用程序具有正确的访问模式”。例如,如果您在列表中向下走,并根据在那里找到的内容决定在当前位置或附近插入项目,那么链接列表就很有效。如果您需要完全随机访问,那么链表很糟糕。
  • 链表与数组的另一个方面是调整大小。由于调整大小,Java 实现了 add 操作的摊销 O(1)。
猜你喜欢
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多