据说LinkedList的删除和插入操作的复杂度为O(1),而ArrayList的复杂度为O(n)。
对于大小为"M"的ArrayList:如果我想要删除第N个元素,我可以直接使用索引来到达第N个位置(无需遍历到第N个索引),然后删除该元素,到这一步的复杂度为O(1),然后我将不得不移动其余的元素(M-N次移动),因此我的复杂度将是线性的,即O(M-N+1)。因此,在最后删除或插入会给我最佳的性能(因为N ~ M),而在开头删除或插入将是最差的(因为N ~ 1)。
现在考虑大小为"M"的LinkedList:由于我们无法直接到达LinkedList中的第N个元素,因此要访问第N个元素,我们必须遍历N个元素,因此在LinkedList中的搜索比ArrayList更昂贵...但是据说在LinkedList中删除和添加操作的复杂度为O(1),因为在LinkedList中没有涉及到元素移动,但是遍历操作本身是否涉及成本呢?因此,复杂度应该是O(n)的,其中最差的性能将在尾节点处,最佳性能将在头节点处。
请问有谁能解释一下为什么在计算LinkedList删除操作的复杂度时,我们不考虑遍历成本呢?
因此,我想了解它在java.util包中是如何工作的。如果我想在C或C++中实现相同的操作,如何实现LinkedList的随机删除和插入的O(1)复杂度?
对于大小为"M"的ArrayList:如果我想要删除第N个元素,我可以直接使用索引来到达第N个位置(无需遍历到第N个索引),然后删除该元素,到这一步的复杂度为O(1),然后我将不得不移动其余的元素(M-N次移动),因此我的复杂度将是线性的,即O(M-N+1)。因此,在最后删除或插入会给我最佳的性能(因为N ~ M),而在开头删除或插入将是最差的(因为N ~ 1)。
现在考虑大小为"M"的LinkedList:由于我们无法直接到达LinkedList中的第N个元素,因此要访问第N个元素,我们必须遍历N个元素,因此在LinkedList中的搜索比ArrayList更昂贵...但是据说在LinkedList中删除和添加操作的复杂度为O(1),因为在LinkedList中没有涉及到元素移动,但是遍历操作本身是否涉及成本呢?因此,复杂度应该是O(n)的,其中最差的性能将在尾节点处,最佳性能将在头节点处。
请问有谁能解释一下为什么在计算LinkedList删除操作的复杂度时,我们不考虑遍历成本呢?
因此,我想了解它在java.util包中是如何工作的。如果我想在C或C++中实现相同的操作,如何实现LinkedList的随机删除和插入的O(1)复杂度?