私は本当にこのリストの確率のことを理解していません. 「n/2 + 1 個以下のノードを検査する必要がある」というステートメントに加えて (n はリストの長さ)。 + 2 つのノードを調べる". この声明は、次のリンクで読みました: ftp://ftp.cs.umd.edu/pub/skipLists/skiplists.pdf
4 に答える
あなたが理解していないのは、すべてのノードがレベル 1 でリンクを持っているということです。つまり、最下位レベルでは、データ構造は本質的にリンクされたリストです。これを使用してノードを検索することは、もちろん O(n) 操作です。
スキップ リストの各ノードには、少なくとも1 つのリンク (レベル 1 のリンク) があります。平均して、ノードの半分にはレベル 2 のリンクもあります。これがリンクが存在する最高レベルである場合、 O(n/2) の任意のノード。基本的に、探している項目が見つかるか、探している値よりも大きな値を持つノードに到達するまで、第 2 レベルのノードをたどります。その時点で、レベル 1 のノードに降りて、前のノード (つまり、探しているノードよりも小さいノード) から前方に検索します。
ここでも平均して、ノードの 1/4 にレベル 3 のリンクがあります。これらを使用すると、O(n/4) で任意のノードを見つけることができます。最初にレベル 3 のノードを、ノードが見つかるか通過するまで検索し、その時点からレベル 2 のノードにドロップダウンし、レベル 2 のノードが見つからない場合はレベル 1 のノードにドロップダウンします。
数学に従うと、最大レベルがm
の場合、スキップ リスト内のノードが 未満である限り2^m
、償却平均検索時間は O(log2(n)) になることがわかりn
ます。リスト内のアイテム。
したがって、スキップ リスト ノードの構造は次のようになります。
SkiplistNode
{
int level;
SomeType data; // the data held in the node
SkiplistNode* forwards[]; // an array of 'level' forward references
}
ノードの値が 1 の場合、配列level
には 1 つの項目しかありません。forwards
レベル 4 の場合、レベル 4、3、2、および 1 のそれぞれに 1 つずつ、合計 4 つのエントリがあります。
結局のところ、配列の平均サイズは 2 です。これは進行に従います。forwards
1 + 1/2 + 1/4 + 1/8 + 1/16, + 1/32, ...
Every node has a link at level 1
1/2 of the nodes have a link at level 2
1/4 of the nodes have a link at level 3
1/8 of the nodes have a link at level 4
etc.
それは今より明確ですか?
スキップ リストについては、ウィキペディアの記事で詳しく説明されています。データ構造自体について特定の質問がある場合は、遠慮なく質問してください。
やや理解しやすい説明がここにあります: http://igoro.com/archive/skip-lists-are-fascinating/
スキップ リストに関する MIT の講義: http://video.google.com/videoplay?docid=-6710586843601387849#