データ検索アルゴリズムとしてのYunxiデータベース選択ARTツリー

まず、データ検索の定義

データルックアップは、クエリ要件に従ってコンピュータファイルまたはデータベースから必要なデータを抽出する手法です。検索対象のすべてのデータがコンピュータの内部メモリに配置されている場合、この種の検索は内部検索と呼ばれます。検索対象のデータがメモリではなく外部メモリにある場合、この種の検索は外部検索と呼ばれます。

データは通常、データ項目、レコード、ファイルの3つのレベルに従って特定の構造で編成されます。ファイルの整理に使用される基本的なデータ項目は、キーワードと呼ばれます。ファイルからのいわゆる検索データとは、指定されたキー値に従ってファイル内のキー値を含むレコードを見つけることを指します。さまざまなファイル構造とクエリ要件に対して、さまざまな検索手法が必要です。

さまざまなデータセット(配列、線形テーブル、ツリーなどのデータ構造を含む)では、セット内のデータレコードの実際の位置はランダムであり、データレコードのキー間に明確な関係はありません。したがって、データセット内のデータレコードを見つけるには、一連のキーワード比較が必要です。たとえば、順番に検索すると、比較の結果は「=」と「!」の2つの可能性になります。半探索、二分探索ツリー検索、ツリー検索の場合、比較結果は「>」、「<」、「=」の3つの可能性があります。

ほとんどの検索アルゴリズムは、キーワードの比較に基づいています。検索の効率は、主に検索中に実行された比較の数と期間によって決まります。同じキーワードモードでは、比較の数が最も重要な要素です。(木を比較してください)

最も理想的な検索アルゴリズムは、比較せずに1回の操作で検索されたデータレコードを取得することです。次に、データレコードの実際の場所とそのキーの間に一意に決定された対応を確立して、各キーがデータセット内の一意の実際の場所に対応するようにする必要があります。

データルックアップを実装するには、次の3つの方法があります。

(1)ツリーを比較するには、値を見つけるために複数のキーワードを比較する必要があります。

(2)ハッシュテーブル:データレコードの場所とキーワードの間の対応する関係が報われます。値は1回の計算で見つけることができ、正しいキーワードが見つかったことを確認するには、キーワードの比較が必要です。

(3)プレフィックスツリー:1つのキーワード比較のみが必要であり、キーワードは複数の部分に分割され、別々に比較されます。

 

比較ツリー

アルゴリズムの比較ツリー(決定木または検索ツリーとも呼ばれます)は、アルゴリズムの動作をトレースし、各キー(キー、キー)とツリーノード(円で表す)との比較を示すことによって取得されます円の中に、ターゲットキーと比較するためにそれらのキーのインデックスを配置します。円の位置から下に枝(線)が引かれ、比較の結果が示され、前と同じようにマークが付けられます。

比較ツリーでは、通常、文字列ではなく数値が使用されます。キー全体を原子的に比較します。

 

2.1 BST

バイナリ検索ツリー(BST)は、バイナリ検索ツリーまたはバイナリソートツリーとも呼ばれます。

https://img2018.cnblogs.com/blog/1775037/201909/1775037-20190922162451691-280943069.png

(1)二分探索木は、各ノードがオブジェクトであるリンクリストデータ構造で表すことができる二分木で構成されます。一般に、キーと場所のデータに加えて、各ノードには、ノードの左の子、右の子、および親(親ノード)をそれぞれ指す属性lchild、rchild、およびparentも含まれています。

(2)子ノードまたは親ノードが存在しない場合、対応する属性の値は空(NIL)です。ルートノードは、親ポインターがNULLであるツリー内の唯一のノードであり、リーフノードの子ノードポインターもNULLです。

BSTの各データ項目には、他のデータ項目と区別するために使用される独自のキー(キー)があります。データ項目を見つけることは、そのキーワードを見つけることと同じです。このようなアクセス方法には前提条件があります。つまり、キーはサイズ比較と等式比較をサポートする必要があります。

 

2.2 AVL

AVLツリーは、発明された最初の自己平衡二分探索木です。AVLツリー内の任意のノードの2つのサブツリー間の高さの最大差は1であるため、高さバランスツリーとも呼ばれます。AVLツリーは本質的に二分探索木であり、その特徴は次のとおりです。

(1)それ自体は何よりもまず二分探索木です。

(2)平衡状態の場合:各ノードの左右のサブツリーの高さの差の絶対値(平衡係数)は最大1です。

つまり、AVLツリーは本質的にバランスの取れた機能を持つ二分探索木(二分探索木、二分探索木)です。ツリー構造は、左利きおよび右利きのアルゴリズムによって調整されます。

2.3赤黒木

赤黒木は、自己平衡二分探索木です。高い検索性能を得るために、挿入および削除操作中の特定の操作を通じて二分探索木のバランスを維持します。

赤黒木は平衡二分探索木の変形です。左右のサブツリー間の高さの差は1より大きい場合があるため、赤黒木は厳密には平衡二分木(AVL)ではありませんが、コストがかかります。バランシングの平均パフォーマンスはAVLよりも強力です。

赤黒木は、C ++ STLのコンテナマップ、セット最下層、Linuxタスクスケジューリング、仮想メモリなどに適用されます。

赤黒木は、次のプロパティを持つほぼバランスの取れた二分探索木です。

(1)各ノードは赤または黒のいずれかです。

(2)ルートノードは黒である必要があります。

(3)赤いノードを連続させることはできません(つまり、赤いノードの子も父親も赤にすることはできません)。

(4)ノードごとに、このポイントからヌル(ツリーの終わり)までのパスには、同じ数の黒いノードが含まれます。

(5)各リーフノードは黒です。

 

2.4 ジャンプテーブル

フォワードポインタが追加されたリンクリストは、ジャンプリストと呼ばれます。スキップテーブルのフルネームはスキップテーブルと呼ばれ、スキップテーブルと略されます。

スキップリストはランダム化されたデータ構造であり、基本的にはバイナリ検索を実行できる順序付けられたリンクリストです。スキップリストは、元の順序付きリンクリストにマルチレベルのインデックスを追加し、そのインデックスを使用して高速検索を実現します。テーブルをスキップすると、検索のパフォーマンスだけでなく、挿入および削除操作のパフォーマンスも向上します。RocksdbのmemTableは、インラインスキップリストを使用します。

スキップテーブルの機能:

(1)最下層にはすべての要素が含まれています。

(2)各要素が挿入されると、そのレベルがランダムに生成されます。

(3)要素がlevel(x)に表示される場合、その要素はxより下のレベルに表示される必要があります。

(4)各インデックスノードには、下と右の2つのポインタがあります。

(5)スキップテーブルのクエリ、挿入、削除の時間計算量はO(log n)であり、平衡二分木に近いです。

(6)高範囲トラバーサルパフォーマンス

ジャンプテーブルでの要素の挿入、削除、検索の時間計算量は赤黒木と同じで、時間計算量はO(logn)であり、ジャンプテーブルには赤黒木という特徴があります。一致できません。スキャン。

したがって、業界ではスキップテーブルがよく使用されます。最大の高さは最初に決定されるため、つまり、インデックス付けされたデータの量を事前に見積もる必要があります。

 

2.5B-

Bツリーは多方向探索木です。1970年、R.BayerとE.mccreightは外部検索に適したツリーを提案しました。これは、Bツリー(またはBツリー、B_tree)と呼ばれるバランスの取れたマルチフォークツリーです。

次数mの平衡木は、平衡m-way探索木です。これは、空のツリー、または次のプロパティを満たすツリーのいずれかです。

(1)ルートノードには少なくとも2つの子があります。

(2)各非ルートノードに含まれるキーワードの数jは、次の条件を満たす。┌m/2┐-1<= j <= m-1;

(3)ルートノード(リーフノードを除く)を除くすべてのノードの次数は、キーワードの総数に1を加えたものであるため、内部サブツリーの数kは次の条件を満たす。┌m/2┐<= k <= m;

(4)すべてのリーフノードは同じレイヤーにあります。

Bツリーの検索は、ルートノードから開始し、ノード内のキーワードの(順序付けられた)シーケンスに対してバイナリ検索を実行します。ヒットした場合は終了し、それ以外の場合は、クエリキーワードが含まれる範囲の子ノードに入ります。属する;の子ポインタがnullになるか、すでにリーフノードになるまで繰り返します

 

2.6B+ツリー

B +ツリーはツリーデータ構造であり、n-aryツリーであり、各ノードには通常複数の子があり、B +ツリーにはルートノード、内部ノード、およびリーフノードが含まれます。ルートノードは、リーフノードまたは2つ以上の子ノードを含むノードの場合があります。

B +ツリーは、ファイルシステムに必要なBツリーのバリアントツリーです。B +ツリーは、ディスクまたはその他の直接アクセス補助デバイス用に設計されたバランスの取れたルックアップツリーです。B +ツリーはBツリーの変形であり、多方向探索ツリーでもあります。

B +ツリーの定義は、基本的にBツリーと同じですが、次の点が異なります。

(1)非リーフノードのサブツリーポインタの数は、キーワードの数と同じです。

(2)非リーフノードのサブツリーポインタP [i]は、キー値が[K [i]、K [i + 1])に属するサブツリーを指します(Bツリーは開区間です)。

(3)すべてのリーフノードにチェーンポインタを追加します。

(4)すべてのキーワードはリーフノードに表示されます。

B +ツリーは、データベースおよびオペレーティングシステムのファイルシステムで一般的に使用されます。NTFS、NSS、XFS、JFS、BFSなどのファイルシステムはすべて、メタデータインデックスとしてB+ツリーを使用します。B +ツリーの特徴は、データを安定して整然と保つことができ、その挿入と変更の対数時間計算量が比較的安定していることです。B+ツリー要素はボトムアップで挿入されます。

 

3.ハッシュテーブル

ハッシュテーブル(ハッシュテーブルとも呼ばれます)は、キー(Key)に従って直接アクセスされるデータ構造です。キーをテーブル内の場所にマッピングしてレコードにアクセスし、ルックアップを高速化します。このマッピング関数はハッシュ関数と呼ばれ、レコードの配列はハッシュテーブルと呼ばれます。

テーブルMが与えられると、関数f(key)があります。任意のキーワードキーに対して、関数を関数に代入した後、テーブル内のキーワードを含むレコードのアドレスを取得できる場合、テーブルMはaと呼ばれます。ハッシュテーブル。、関数f(key)はハッシュ関数です。

Linuxカーネルではハッシュテーブルが多用されています。

2つの異なるキーワードが同じハッシュコード(テーブル内のアドレス)を持っている場合、この現象はハッシュ競合と呼ばれます。任意の長さのメッセージが固定長のメッセージに圧縮されたときに情報が失われることが、ハッシュの競合の根本的な原因です。

ハッシュテーブル内のハッシュ衝突を解決する方法:

(1)アドレス指定方法の開発(線形検出と再ハッシュ、二次検出と再ハッシュ、疑似ランダム検出と再ハッシュ):現在のアドレスに基づいてアドレスを計算します

(2)再ハッシュ方式:複数の異なるハッシュ関数を同時に構築します

(3)チェーンアドレス方式:同じアドレスを持つすべてのハッシュアドレスが同じリンクリストに配置されます

(4)パブリックオーバーフロー領域を確立します。ハッシュテーブルは、基本テーブルとオーバーフローテーブルの2つの部分に分割されます。基本テーブルと競合するすべての要素は、オーバーフローテーブルに入力されます。

ハッシュの競合が多すぎるため、データの挿入/削除時に競合リスト全体をロックする必要があり、同期のオーバーヘッドが増加します。競合リンクリストが長すぎるため、トラバーサルのオーバーヘッドが過剰になります。競合を解決する効果的な方法は、より大きなハッシュテーブルを使用してデータを再ハッシュすることです。

 

第四に、プレフィックスツリー

トライは、プレフィックスツリーまたはディクショナリツリーとも呼ばれ、連想配列を保持するために使用される順序付きツリーであり、そのキーは通常文字列です。二分探索木とは異なり、キーはノードに直接格納されませんが、ツリー内のノードの位置によって決定されます。ノードのすべての子孫には、このノードに対応する文字列である同じプレフィックスがあり、ルートノードは空の文字列に対応します。一般に、すべてのノードに対応する値があるわけではなく、リーフノードと一部の内部ノードに対応するキーのみに関連する値があります。

https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fupload-images.jianshu.io%2Fupload_images%2F14371562-86b3d9e87b112db4.png&refer=http%3A%2F%2Fupload-images.jianshu.io&app= 2002&size = f9999,10000&q = a80&n = 0&g = 0n&fmt = jpeg?sec = 1636600703&t = f50b46adfb3c0ad6ec749877c669d4c5

3つの基本的なプロパティがあります。

(1)ルートノードには文字が含まれておらず、ルートノードを除く各ノードには1文字しか含まれていません。

(2)ルートノードから特定のノードまで、パスを通過する文字が接続されます。これは、ノードに対応するキーワードです。

(3)各ノードのすべての子ノードには異なる文字が含まれています。

 

4.1基数木

基数ツリーは、圧縮プレフィックスツリーとも呼ばれ、よりスペースを節約するTrie(プレフィックスツリー)です。すべてのノードは、トークンのすべての値を格納するために固定サイズの配列を使用します。バイナリ文字列をキーとするトライツリーはマルチフォークツリー構造であり、マルチレイヤーインデックステーブルに似ています。各中間ノードには複数の子ノードへのポインタの配列が含まれ、リーフノードにはへのポインタが含まれます。実際のオブジェクト。

https://gimg2.baidu.com/image_search/src=http%3A%2F%2Foscdn.geek-share.com%2FUploads%2FImages%2FContent%2F201908%2F13%2F9be1cdf6764641e0ef914503c27a1342.jpg&refer=http%3A%2F%2 geek-share.com&app = 2002&size = f9999,10000&q = a80&n = 0&g = 0n&fmt = jpeg?sec = 1636614619&t = 59601f87185dbdbacc9a55cfd4e66de7

その特徴は次のとおりです。

(1)ツリーの高さ(複雑さ)はレコード数とは関係なく、キー値の長さのみです。

(2)更新と削除はツリー構造の調整を伴わず、異なる挿入シーケンスは同じツリーを生成します

(3)ノードのキーを示すリーフノードへのパス。

 短所:キー値がまばらな場合、各ノードのスペースが非常に小さく、メモリが浪費されるため、基数木はDBMSで広く使用されていません。

 

4.2アートツリー

アダプティブ基数ツリー(アダプティブ基数/プレフィックスツリー、ART)は可変基数ツリーです。基数ツリーに基づいて、可変機能を追加するように最適化されており、そのコアはスペースの使用率を最適化することです。各ノードは同じサイズのスペースではなくなりましたが、必要に応じて異なるノードタイプを使用します。

基数ツリーのARTツリーの最適化ポイントは、ノードのさまざまなタイプへの分割、パスの圧縮、および遅延拡張です。

 

5.MassTree

これは、B +ツリーと基数ツリーの混合として理解できます。つまり、キーは複数の部分に分割され、各部分はノードです。各ノードは、スペースとパフォーマンスを考慮して、内部のB+ツリーです。

各破線のボックスはB+ツリーを表し、B +ツリーの各レイヤー(レイヤー)について、8バイトがインデックス作成に使用されます。長さが(8h + 8)バイト未満のキーは、レイヤー<=hに格納されます。たとえば、2つのキーがレイヤー1に格納されている場合、それらの最初の8バイトは同じです。

円は内部ノード(B +ツリーのブランチノード)を表し、長方形は境界ノード(B +ツリーのリーフノード)を表し、5つの尖った星は値を表します。境界ノードの値フィールドは、データを格納する場合もあれば、次のサブツリーのルートノードを格納する場合もあります。

 

6.ハッシュツリー

ハッシュツリー(ハッシュツリー、マークルツリー)はツリー型のデータ構造であり、各リーフノードにはデータブロックのハッシュのラベルが付けられ、リーフノード以外のノードにはその子ノードの暗号化されたハッシュのラベルが付けられます。 。ハッシュツリーにより、大規模なデータ構造の内容を効率的かつ安全に検証できます。

素数解決アルゴリズムを選択して、ハッシュツリーを構築します。

ルートはハッシュツリーのルートです(紺色のノード)。

R0とR1は、除数シーケンスの最初の番号に対応する、合計2つの最初のレイヤーノード(灰色のノード)です。

R00 、R01、R02、R10、R11、R12は、2番目のレイヤーノード(黄色のノード)で、合計6つです。このうち、R00、R01、R02はR0に属する子ノードであり、R10、R11、R12はR1に属する子ノードです。R0とR1の下にはそれぞれ3つの子ノードがあり、除数シーケンスの2番目の番号に対応します。

後続のR00、R01、R02、R10、R11、およびR12ノードには、除数シーケンスの3番目の番号に対応する5つの子ノード(白いノード)がそれぞれあります。

2から始まる連続する素数、10の連続する素数は、およそM(10)= 2 * 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23 * 29=6464693230を解決できます。

 

7、検索アルゴリズムのパフォーマンス比較

ART  :アダプティブ基数木

CSB  :メモリ最適化B +ツリー(キャッシュセンシティブB +ツリー[CSB])、

kary  :各ノードにk次元の点があるツリー(k-ary探索木)

FAST :バランスの取れたバイナリツリークエリ用に最適化(Fast Architecture Sensitive Tree)

GPT  :基数树(一般化されたプレフィックスツリー)

•RB:赤黒木、

•HT:ハッシュテーブル(MurmurHashを使用したチェーンハッシュテーブル)。

上記の2つの比較から、ARTツリーはハッシュテーブルにほぼ匹敵する優れたパフォーマンスを持っていることがわかります。ハッシュテーブルに対するARTツリーの利点は、範囲ルックアップをサポートすることです。したがって、 Yunxi Databaseは、ストレージレイヤーでのデータルックアップにARTツリーアルゴリズムを使用します。

{{o.name}}
{{m.name}}

おすすめ

転載: my.oschina.net/u/5148943/blog/5391883