「アルゴリズム」3つの検索

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/weixin_43928720/article/details/102768569

1.順不同リスト

見つけるために順序なしリスト
番号なしリストに基づいて、Nキーを備えたシンボルテーブルを、ミスのルックアップ、挿入操作は、Nの比較が必要です。最悪の場合にはヒットN時間を比較する必要性を見つけ、N個の異なるキーが空のテーブルに挿入されているがN ^ 2/2回を必要とします。
テーブルに存在しないキーを探しているとき、私たちは鍵を与えられた各キーをテーブルと比較します。重複キーが許可されていないので、各挿入する前に、我々は再びそれを見つける必要があります。

2.秩序配列

バイナリサーチの規則正しいアレイ
バイナリサーチは、N個のキーの順序付けられたアレイに1 + LGNとの比較(成功したか否か)を取ることができます。
ここに画像を挿入説明
コアの質問は、操作が見つけ、アルゴリズムとデータ構造のレベルの数を挿入するようにしていることを確保しながら、我々は見つけることができるかどうかです。
効率的な挿入操作をサポートするために、我々は、鎖状構造を必要としているように見えるが、単独リンクリストを使用することはできませんすぐに任意のサブ配列インデックスの中央の要素を介して取得する、バイナリ検索からのような効率的なバイナリ検索ですが、リストを取得します中間要素の唯一の方法は、鎖に沿って横断することができます。
柔軟性バイナリ検索効率と一緒に一覧表示するには、我々は、より複雑なデータ構造にする必要があります。同時に両方を持つことができ、バイナリ検索ツリー、および続くハッシュテーブルです。

3.バイナリ検索ツリー

ここに画像を挿入説明
実行時間バイナリ探索ツリーアルゴリズムを使用してそれぞれ、最良の場合では、ノードにNを含むツリーは完全にバランスされ、ツリーの形状に依存し、次にツリーは、挿入された配列の形状に依存しますルートノードから物品及びエアリンクが最悪の場合には、検索パス上にN個のノードが存在してもよい、LGNです。

4.バランスの取れた検索ツリー

(1)2-3树
为了保证查找树的平衡性,我们需要一些灵活性,因此在这里我们允许树中的一个结点保存多个键。确切地说,我们将一颗标准的二叉查找树中的节点称为2-结点(含有一个键和两条链接),而我们现在引入3-结点,它含有两个键和3条链接。左连接指向的2-3树种的键都小于该结点,中链接指向的2-3树中的键都位于该节点的两个键之间,右链接指向的2-3树中的键都大于该节点。
查找
要判断一个键是否在树中,我们先将它和根节点中的键比较。如果它和其中任意一个相等,查找命中。否则我们就根据比较的结果找到指向相应区间的链接,并在其指向的子树中递归地继续查找。
插入
我们使用2-3树的主要原因就在于它能够在插入后继续保持平衡。
向2-结点中插入新键
如果未命中的查找结束于一个2-结点,事情就好办了,我们只要把这个2-结点替换为一个3-结点。将要插入的键保存在其中即可。
向3-结点中插入新键
ここに画像を挿入説明
为了将新键插入,我们先临时将新键存入该结点中,使之成为一个4-结点。很容易将它转换为一棵由3个2-结点组成的2-3树,其中一个结点含有中键(根节点),一个结点含有3个键中的最小值(和根节点的左连接相连),一个结点含有3个键中的最大值(和根节点的右链接相连)。这棵树既是一棵含有3个节点的二叉查找树,同时也是一棵完美平衡的2-3树。插入前树的高度为0,插入后树的高度为1。

向一个父节点为2-节点的3-节点中插入新键
ここに画像を挿入説明
我们先像上面那样构造一个临时的4节点并将其分解,但此时我们不会为中键创建一个新节点,而是将其移动到原来的父节点上。父节点也从一个2节点转换为了一个3节点。另外,这次转换也并不影响2-3树的主要性质,树仍然是有序的,因为中键被移动到父节点中去了,树仍然是完美平衡的。

親ノード、3-、3-ノードに挿入される新しい鍵

ここに画像を挿入説明
最後までミスが親ノードに、3-ノードを検索すると仮定すると。もう一度、私たちは一時的と4ノードを構築し、それを分解してきました。これは、その親ノード内のキーに挿入されています。しかし、また、3-親ノードは、この私たちは、新しいボタン、4-一時的なノードを構築し、同じノードに切り替えます。親ノードと鍵でその分解、すなわち、その親のノードに挿入されています。一般的な場合に拡張、我々は単に、それが分解を継続する必要があるノードに遭遇し、2〜3ノードと交換するまで上方分解一時鍵4は、ノードと、より高いレベルの親ノードに挿入され、継続されまたは3-ルートノードに到達します。

分解ルート

ここに画像を挿入説明
すべてのノードへのルート・ノードからの挿入が3であれば、我々は最終的には一時的なルートの4-ノードになります。この時点で、我々は新しいノードキーツリー方式を挿入するために、3-に従ってこの問題に対処することができます。

ローカル変換

図4に示すように、ノードツリー2-3の分解は、ケース6を有していてもよいです。

ここに画像を挿入説明
Nは、アクセス・ノード内のルックアップ、挿入操作はLGNのサイズを超えてはならない、2-3木です。したがって、我々は最悪の場合には、2-3ツリーを決定することができ、良好なパフォーマンスは、コストのいずれかが、確かにレベルの数を超えないようにしている探したり挿入し、依然として存在しています。
しかし、我々は実際の距離がまだある実現します。我々はデータの2-および3-ノードnode異なるタイプを表すことができるが、我々は、ノードの二つの異なるタイプを維持する必要があるが、これらのコードを達成するために多量に必要としないだけ。そして、彼らが発生するオーバーヘッドは、よりゆっくりと、標準のバイナリ検索ツリーよりもアルゴリズムを引き起こす可能性があります。

おすすめ

転載: blog.csdn.net/weixin_43928720/article/details/102768569