我试图弄清楚下面代码的运行时间,无论列表是数组列表还是链接列表。我很感激任何建议!
数组:我认为删除操作是 O(n),循环是 N/2,所以 O(n^2)
LinkedList:只有引用发生变化,因此删除时间恒定,循环时间为 N/2,所以 O(n)
int halfSize = lst.size() / 2;
for (int i = 0; i < halfSize; i++){
lst.remove(0);
}
我试图弄清楚下面代码的运行时间,无论列表是数组列表还是链接列表。我很感激任何建议!
数组:我认为删除操作是 O(n),循环是 N/2,所以 O(n^2)
LinkedList:只有引用发生变化,因此删除时间恒定,循环时间为 N/2,所以 O(n)
int halfSize = lst.size() / 2;
for (int i = 0; i < halfSize; i++){
lst.remove(0);
}
ArrayList:评估正确,由于底层数组副本
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
LinkedList : 评估正确,节点移除 @zero 索引是常数
public E remove(int index) {
checkElementIndex(index);
return unlink(node(index));
}
/**
* Returns the (non-null) Node at the specified element index.
*/
Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}