【发布时间】:2013-03-21 20:55:11
【问题描述】:
来自linked-list标签维基摘录:
链表是一种数据结构,其中的元素包含 对下一个(也可以是前一个)元素的引用。链接 列表提供O(1) 在任意位置插入和删除,O(1) 列表 连接和 O(1) 访问在前面(和可选的后面) 位置以及 O(1) 下一个元素访问。随机访问有 O(N) 复杂且通常未实现。
(强调我的)
我很惊讶地看到这个 - 列表 insert 怎么能比简单地读取那个索引复杂度低?
所以我查看了the source code for java.util.LinkedList。 add(int, E) method 是:
public void add(int index, E element) {
addBefore(element, (index==size ? header : entry(index)));
}
addBefore(E, Entry<E> method 只是简单的指针重新分配,但还有entry(int) method:
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size);
Entry<E> e = header;
if (index < (size >> 1)) {
for (int i = 0; i <= index; i++)
e = e.next;
} else {
for (int i = size; i > index; i--)
e = e.previous;
}
return e;
}
即使使用半尺寸优化,这里的 for 循环(一个或另一个)在我看来是一个死的赠品,这种方法(因此 add(int, E))在 O 的最小最坏情况下运行(n) 时间,当然不是恒定的时间。
我错过了什么?我误解了大 O 符号吗?
【问题讨论】:
标签: linked-list java linked-list big-o time-complexity