次のコラム Redis チュートリアル では、Redis データ構造のジャンプ テーブルについて詳しく説明します。困っている友人の役に立てば幸いです。
ジャンプ リストは、ノードにすばやくアクセスするという目的を達成するために、各ノード内の他のノードへの複数のポインタを保持する順序付けされたデータ構造です。このように、理解するのは難しいかもしれませんが、まずリンクされたリストを思い出してください。
単一リンク リストの場合、必要に応じて、リンク リストに格納されているデータが順序付けされている場合でも、その中の特定のデータを見つけるには、リンクされたリストを最初から最後までたどることしかできません。この方法では、検索効率は非常に低くなり、時間計算量は O(n) と非常に高くなります。
検索効率を向上させたい場合は、リンクされたリストにインデックスを構築することを検討できます。前のレベルまでの 2 つのノードごとに 1 つのノードを抽出し、抽出されたレベルをインデックスと呼びます。
この時点では、ノード 8 を見つけたいと仮定します。最初にインデックス レイヤをトラバースできます。インデックス レイヤの値 7 を持つノードまでトラバースすると、次のことがわかります。次のノードが 9 である場合、検索するノード 8 はこれら 2 つのノードの間にある必要があります。リンク リスト レベルまで降下し、ノード 8 を見つけるためにトラバースを続けました。当初、単一リンク リストでノード 8 を見つけるには 8 つのノードを走査する必要がありましたが、第 1 レベルのインデックスを使用することで、5 つのノードを走査するだけで済みます。
この例から、インデックスのレイヤーを追加した後、ノードを見つけるために通過する必要があるノードの数が減少し、検索効率が向上していることがわかります。 、別のレベルのインデックスを追加します。
写真を見ると、検索効率が再び向上していることがわかります。この例ではデータが非常に少ないですが、データが大量にある場合は、マルチレベルのインデックスを追加すると、検索効率が大幅に向上します。
このリンク リストと複数レベルのインデックスのような構造は、ジャンプ リストです。
Redis は、順序付きセット キーの基礎となる実装の 1 つとしてジャンプ テーブルを使用します。順序付きセットに多数の 要素が含まれる場合、または順序付きセット内の要素の メンバーが比較的長い文字列 である場合、Redis は順序付きセット キーの基礎となる実装としてジャンプ テーブルを使用します。
ここで、疑問について考える必要があります。多数の要素がある場合、またはメンバーが比較的長い文字列である場合、Redis はなぜジャンプ テーブルを使用して実装するのでしょうか?
上記のことから、ジャンプ リストはリンク リストにマルチレベルのインデックスを追加して検索の効率を向上させていることがわかりますが、これは時間に対するスペースを考慮したソリューションであり、必然的に問題 - インデックスはメモリを消費します。元のリンク リストは非常に大きなオブジェクトを格納する場合がありますが、インデックス ノードはキー値といくつかのポインタを格納するだけでよく、オブジェクトを格納する必要がないため、ノード自体が比較的大きい場合や要素数が少ない場合には、比較的大きいため、その利点は必然的に拡大されますが、欠点は無視できます。
Redis のスキップ テーブルは、Redisのデータ構造のジャンプテーブルの詳細説明 と Skiplist の 2 つの構造体によって定義されます。Redisのデータ構造のジャンプテーブルの詳細説明 構造体はスキップ テーブル ノードを表すために使用され、zskiplist 構造体はジャンプを保存するために使用されます。ノード数、先頭ノードと末尾ノードへのポインタなど、テーブル ノードに関連する情報です。
上図はスキップ リストの例を示しており、一番左はスキップリスト構造であり、次の属性が含まれています。
header: ジャンプ テーブルのヘッダー ノードを指します。このポインター プログラムを通じてヘッダー ノードを見つける時間計算量は O(1)
tail: ジャンプ テーブルの末尾ノードを指します。このポインタ プログラムを通じてテーブルの末尾ノードを見つける時間計算量は O(1)
レベル: レコードです現在のジャンプ テーブル、最大レイヤー数を持つノードのレイヤー数 (ヘッダー ノードのレイヤー数は含まれません)、この属性を通じて、最適なレイヤー高さを持つノードのレイヤー数を決定できます。 O(1) 時間計算量で取得されます。
length: ジャンプ テーブルの長さ、つまり、ジャンプ テーブルに現在含まれているノードの数 (ヘッド ノードは含まれません) を記録します。この属性により、プログラムは O( 1) ジャンプ リストの長さを時間計算量で返します。
構造体の右側には 4 つの Redisのデータ構造のジャンプテーブルの詳細説明 構造体があり、次の属性が含まれています。
時間計算量 | |
---|---|
O(1) | |
O(N) | |
平均 O (logN)、最悪の場合 O(logN) (N はスキップ リストの長さ) | |
平均は O(logN)、最悪は O(logN) (N はジャンプ テーブルの長さ) | |
平均 O(logN)、最悪 O(logN) (N はジャンプ テーブルの長さ) | |
平均 O(logN)、最悪 O(logN) (N はジャンプ リストの長さ) | |
#O(1) | #スコア範囲を指定すると、この範囲に一致するジャンプ テーブル内の最後のノードを返します |
スコア範囲を指定します。ただし、この範囲内にあるジャンプ テーブル内のすべてのノードは除きます。範囲 | |
指定されたランキングの範囲。ただし、ジャンプ リスト この範囲内のノード | |
0 ~ などのスコア範囲 (範囲) を指定します。 15 、 20 ~ 28 など。ジャンプ テーブル内の少なくとも 1 つのノードのスコアがこの範囲内にある場合は 1 が返され、そうでない場合は 0 が返されます。 | |
この記事の焦点
概要ジャンプ テーブルは、私たちにとって少し馴染みのないデータ構造かもしれません。この記事では、ジャンプ テーブルのデータ構造を簡単に紹介し、Redis でのジャンプ テーブルの使用法を分析します。次の記事では、引き続き Redis で使用されるデータ構造の整数コレクションを共有します。乞うご期待!### |
以上がRedisのデータ構造のジャンプテーブルの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。