リンク リストタグ wiki の抜粋から:
リンクされたリストは、要素が次の (オプションで前の) 要素への参照を含むデータ構造です。リンクされたリストは、任意の位置での O(1) の挿入と削除、O(1) リストの連結、および O(1) の次の要素へのアクセスと同様に、前方 (およびオプションで後方) の位置での O(1) アクセスを提供します。ランダム アクセスは O(N) の複雑さを持ち、通常は実装されていません。
(私のものを強調)
私はこれを読んで驚きました – 単純にそのインデックスを読み取るよりも複雑さの少ないランダムなインデックスにリストを挿入するにはどうすればよいでしょうか?
ということで、のソースコードjava.util.LinkedList
を見てみました。add(int, E)
メソッドは次のとおりです。
public void add(int index, E element) {
addBefore(element, (index==size ? header : entry(index)));
}
addBefore(E, Entry<E>
メソッドは単純なポインターの再割り当てですが、次のメソッドもありentry(int)
ます。
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;
}
ハーフサイズの最適化を行っても、ここのループ (どちらか一方) は、このメソッド (したがって) が O(n) 時間の最小の最悪のシナリオで動作し、確かに一定ではないfor
という完全なプレゼントのように思えます。add(int, E)
時間。
私は何が欠けていますか?big-O表記を誤解していますか?