本篇只涉及树的概念范围和应考思路,不涉及具体结构或算法的实现与思考,具体的结构或算法会在后面跟新。
木
コンピュータサイエンスでは、ツリー(英語:tree)は、抽象データタイプまたはこの抽象データタイプを実装するデータ構造であり、ツリー構造の性質を持つデータコレクションをシミュレートするために使用されます。これは、n(n> 0)個の有限ノードで構成される階層コレクションです。逆さまの木のように見えるため、「木」と呼ばれます。つまり、根が上を向き、葉が下を向いています。それは以下を持っています
特徴:
①每个节点有零个或多个子节点;
②没有父节点的节点称为根节点;
③每一个非根节点有且只有一个父节点;
④除了根节点外,每个子节点可以分为多个不相交的子树;
次に、ツリーに関する多くの用語を知っている必要があります:次数、リーフノード、ルートノード、親ノード、子ノード、深さ、高さ。
バイナリツリー
バイナリツリー:ノードごとに最大2つのサブツリーを持つツリーは、バイナリツリーと呼ばれます。(本のテストの質問で通常見られる木はバイナリツリーですが、すべてのツリーがバイナリツリーであるという意味ではありません。)
バイナリツリーの概念の下で、完全なバイナリツリーと完全なバイナリツリーの概念が導き出されます
完全なバイナリツリー:子ノードのない最後のレベルを除いて、各レベルのすべてのノードには2つの子ノードがあります。リーフノードを除くすべてのノードに2つの子ノードがあることも理解できます。ノードの数が最大に達すると、すべてのリーフノードが
完全なバイナリツリーと同じレベルにある必要があります。バイナリツリーの深さがhに設定されている場合、他のすべてのレイヤーのノードの数(1〜(h-1))は最大です。最大数であるh番目のレイヤーのすべてのノードは、完全なバイナリツリーである左端に連続的に集中しています。
アルゴリズムの実装(笑)
バイナリツリー:
private static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
バイナリツリーをトラバースする方法
一次トラバーサル:最初のルートノード->左側のサブツリーをトラバース->右側のサブツリーをトラバース
中次トラバーサル:左側のサブツリーをトラバース->ルートノード->右側のサブツリーをトラバース
注文後のトラバーサル:左側のサブツリーをトラバース->右側のサブツリーをトラバース->ルートノード
4
深度優先検索(DFS)および幅優先検索(BFS)
実装:bfs =キュー、キューに入る、キューから一度に1つのパスにアクセスする; dfs =スタック、スタックをプッシュする、スタックから一度に複数のパスにアクセスする(Zhihuから)
関係:DFSで解決された問題は、BFSで解決できます。DFSは書き込みが簡単(再帰的)で、消費時間は短くなりますが、スタックが爆発しやすくなりますが、BFSはキューの長さを制御できます。
2.動的検索ツリー
2.1バイナリ検索ツリー
バイナリ検索ツリーは、バイナリツリーの派生概念です。
バイナリ検索ツリー(英語:バイナリ検索ツリー)は、バイナリ検索ツリー、順序付けされたバイナリツリー、または並べ替えられたバイナリツリーとも呼ばれ、次のプロパティを持つ空のツリーまたはバイナリツリーを指します。
1いずれかのノードの左側のサブツリーが空でない場合、左側のサブツリーのすべてのノードの値はそのルートノードの値よりも小さくなります
。2。いずれかのノードの右側のサブツリーが空でない場合、右側のサブツリーのすべてのノードの値どちらもそのルートノードの値よりも大きいです
。3。任意のノードの左右のサブツリーもそれぞれバイナリ検索ツリーです
。4。同じキー値を持つノードはありません。
他のデータ構造と比較したバイナリ検索ツリーの利点は、検索と挿入の時間の複雑さがO(logn)よりも低いことです。バイナリ検索ツリーは、セット、複数のセット、連想配列など、より抽象的なデータ構造を構築するために使用される基本的なデータ構造です。
2.2バランスの取れたバイナリツリー(AVLツリー)
バランスの取れたバイナリツリー:任意のノードの2つのサブツリー間の高さの差が1以下のバイナリツリー。
その中で、AVLツリーは、発明された最初の自己平衡型バイナリ検索ツリーであり、最も原始的で典型的な平衡型バイナリツリーです。
バランスの取れたバイナリツリーは、バイナリ検索ツリーに基づく改良です。極端な場合(挿入されたシーケンスが順序付けられている場合など)では、バイナリ検索ツリーがおおよそのチェーンまたはチェーンに縮退するため、この時点で、操作の時間の複雑さは線形、つまりOに縮退します。 (n)。したがって、2つのサブツリー間の高さの差が自己バランス操作(つまり、回転)によって1を超えないバランスの取れたバイナリツリーを構築します。
詳細については、1962年にGMAdelson-VelskyとEMLandisが執筆した論文「情報の整理のためのアルゴリズム」を参照してください。(このピットは後で修正します)
2.3赤と黒の木
赤黒の木は、自己バランス型のバイナリ検索ツリーでもあります。
1.各ノードは赤または黒のいずれかです。(赤または黒)
2。ルートノードは黒です。(ルートブラック)
3。各リーフノード(リーフノードはツリーの最後にあるNILポインターまたはNULLノードを指します)は黒です。(Ye Hei)
4。ノードが赤の場合、その2人の息子は黒です。(赤と黒)
5。どのノードでも、リーフノードツリーの最後にあるNILポインターへの各パスには、同じ数の黒ノードが含まれます。(パスの下の同じ黒)
写真は典型的な赤黒の木を示しています。赤黒の木がその基本的な特性を確実に満たすようにすることは、データ構造の自己バランスを調整することです。
赤黒木のセルフバランス調整操作方法には、回転と色の変更が含まれます。
赤黒ツリーは、JavaコレクションクラスのTreeSetとTreeMapの最下層、C ++ STLのセットとマップ、Linuxの仮想メモリ管理など、広く使用されているデータ構造です。
2.4ハフマンツリー
ハフマンツリーは、加重パスの長さが最短のバイナリツリーであり、最適なバイナリツリーとも呼ばれます。
一般に、次のように構成できます。
1.ルートノードとして、左右のサブツリーはすべて空です。
2.フォレストで、ルートノードの重みが最小の2つのツリーを新しいツリーの左右のサブツリーとして選択し、新しいツリーの追加のルートノードの重みを左右のサブツリールートノードに設定します。重みの合計。左側のサブツリーの重みは、右側のサブツリーの重みよりも小さくする必要があることに注意してください。
3.これらの2つのツリーをフォレストから削除し、同時に新しいツリーをフォレストに追加します。
4.フォレスト内にツリーが1つだけになるまで、手順2と3を繰り返します。このツリーがハフマンツリーです。
実際にはハフマンツリーのアプリケーションであるハフマンコーディングについてもっと聞いたことがあるかもしれません。つまり、テキストに表示される文字をできるだけ短くし、デコード時にあいまいさがないようにする方法です。
3.多方向検索ツリー
大規模なデータストレージでは、インデックスクエリを実装する実際の背景の下で、ツリーノードに格納される要素の数が制限され(要素の数が非常に多い場合、検索はノード内の線形検索に縮退します)、バイナリ検索ツリーにつながりますツリーの構造が深すぎるため、ディスクI / Oの読み取りと書き込みが頻繁に行われ、クエリの効率が低下します。
3.1Bツリー
B-tree(英語:B-tree)は、データを整理することができる自己バランス型ツリーです。このデータ構造により、データの検索、順次アクセス、データの挿入、およびすべての削除を対数時間で行うことができます。一般に、Bツリーは一般化されたバイナリ検索ツリー(バイナリ検索ツリー)であり、最大2つの子ノードを持つことができます。自己平衡型バイナリ検索ツリーとは異なり、Bツリーはディスクなどの比較的大きなデータブロックを読み書きするストレージシステムに適しています。
1.ルートノードには少なくとも2つの子があります。
2.各中間ノードには、k-1個の要素とk個の子が含まれます。ここで、m / 2 <= k <= m
3.各リーフノードにはk-1個の要素が含まれます。ここで、m / 2 <= k <= m
4.すべてのリーフノードは同じレイヤーにあります。
5.各ノードの要素は小さいものから大きいものへと配置され、ノードのk-1要素は、k個の子に含まれる要素の範囲分割です。
図に示すように、仕様を満たすBツリーです。ディスクIOの速度に比べてメモリの消費時間をほぼ省略できるため、ツリーの高さが十分に低く、IOの数が十分に少ない限り、クエリのパフォーマンスを向上させることができます。
Bツリーの追加と削除も、回転と転置を伴う自己バランスの性質に従います。
Bツリーのアプリケーションは、ファイルシステムといくつかの非リレーショナルデータベースインデックスです。
3.2 B +ツリー
B +ツリーはツリーデータ構造であり、通常、リレーショナルデータベース(Mysqlなど)およびオペレーティングシステムファイルシステムで使用されます。B +ツリーは、データを安定して整然と保つ能力を特徴とし、その挿入と変更は比較的安定した対数時間の複雑さを持っています。B +ツリー要素は下から上に挿入されます。これは、バイナリツリーの反対です。
Bツリーに基づいて、リーフノードのリンクリストポインタ(Bツリー+リーフ順序リンクリスト)を追加します。すべてのキーワードはリーフノードに表示され、非リーフノードはリーフノードのインデックスとして使用されます。B+ツリーは常に到着します。リーフノードがヒットします。
b +ツリーの非リーフノードはデータを保存せず、サブツリーの重要な値(最大または最小)のみを保存します。したがって、同じサイズのノードの場合、b +ツリーはbツリーよりも多くのブランチを持つことができ、ツリーをよりスクワットにします。クエリ中に実行されるIO操作の数も少なくなります。
これは通常、ほとんどのノードがハードドライブなどのセカンダリストレージにある場合に発生します。各内部ノード内の子ノードの数を最大化してツリーの高さを減らすことにより、バランシング操作が頻繁に発生せず、効率が向上します。
3.3 B *ツリー
B *ツリーはB +ツリーの変形です。B+ツリーの非ルートノードと非リーフノードに、兄弟へのポインタが追加されます。
B +ツリーに基づいて、非リーフノード用のリンクリストポインタも追加されます。これにより、ノードの最小使用率が1/2から2/3に増加します。
3.4Rツリー
R-treeは、空間データストレージに使用されるツリーのようなデータ構造です。たとえば、地理的な場所、長方形、ポリゴンのインデックスを作成します。
Rツリーのコアアイデアは、同様の距離を持つノードを集約し、ツリー構造の上位レベルでこれらのノードの最小境界長方形(MBR)として表現することです。この最小境界長方形は、上位レベルのノードになります。すべてのノードが最小の境界長方形内にあるため、特定の長方形と交差しないクエリは、この長方形内のすべてのノードと交差してはなりません。リーフノードの各長方形はオブジェクトを表し、ノードはオブジェクトの集合体であり、より多くのオブジェクトがより高く集約されます。各レイヤーは、データセットの近似値と見なすこともできます。リーフノードレイヤーは、データセットと100%の類似性を持つ最も細かい近似値であり、レイヤーが高いほど粗くなります。