データ構造
赤黒い木
赤黒ツリーの特殊な AVL (バランス バイナリ ツリー)。バランス バイナリ ツリーがノードの挿入と削除を行う場合、特性を維持するために大量の回転操作が必要となり、パフォーマンスが低下します。赤黒ツリーは犠牲を払います。厳密なバランス条件を採用し、パフォーマンスを向上させます。赤黒ツリーがアンバランス ツリーに挿入される場合は最大 2 回転が実行され、アンバランス ツリーが削除される場合は最大 3 回転が実行されます。
特徴:
-
黒か赤のどちらか (黒か赤のどちらか)
-
ルートノードは黒です
-
葉の節が黒い
-
ノードが赤の場合、その 2 つの子ノードは黒でなければなりません (ルートからリーフまでのすべてのパス。2 つの連続する赤いノードは存在できません)。
-
ルート ノードからリーフ ノードまでのすべてのパスには、同じ数の黒いノード (同じ黒い高さ) が含まれます。
プロセスのスケジュール方法
メモリの断片化管理 (メモリは赤黒ツリーに関連しています)
ネットワークカードデータ
B ツリーと B+ ツリー
それらの違いは何ですか?
B ツリーは多方向バランス検索ツリーとも呼ばれ、B ツリーが持つ子ノードの最大数は順序と呼ばれます。通常は m で表され、次の条件が満たされます。
- ツリー内のノードには最大 m 個のサブツリーと最大 m-1 個のキーワードがあります。
- ルート ノードがターミナル ノードでない場合は、少なくとも 2 つのサブツリーが必要です
- ルート ノードを除くすべての非子ノードには、少なくとも M/2、最大 M のサブツリーがあり、キーワードの範囲は M/2-1 ~ M-1 です。
- ノードのキーワードには通常、子ノードへのポインタが含まれます。
- 葉ノードは情報なしで同じレイヤーに表示されます
- すべてのノードのバランス係数が 0 です
B ツリーの検索プロセスは 2 つのステップに分かれており、最初のステップではディスク上で行われるノードの検索が行われ、次にノードのキーワードがメモリに読み込まれ、検索が実行されます。ハーフサーチ方式 検索が見つからない場合は、対応する検索を実行 ポインタノードを検索 リーフノードが見つかった場合は、リーフノードが存在しないことを意味します
B+ツリー
- ツリー内のノードには最大で M 個のサブツリーと M 個のキーワードがあります。
- キーワード (サブツリー) の数の範囲は M/2 ~ M であり、キーワードもこの範囲内にあります
- ルート ノードにはまだ少なくとも 2 つのサブツリーがあります
違い:
- B+ ツリーの非リーフ ノードはインデックスとしてのみ機能します。非リーフ ノードの各インデックス項目には、対応するサブツリーの最大キーワードとサブツリーへのポインタのみが含まれますが、キーワードの格納アドレスは含まれません。 。したがって、リーフ ノードにはキーワードが含まれます。つまり、非リーフ ノードのキーワードはリーフ ノードにも表示されます。B ツリーでは、キーワードはリーフ ノードに含まれ、キーワードは他のノードに含まれます。
最小スパニングツリー
クラスカル: 貪欲な思考、特定のアルゴリズム ステップに基づいて、
頂点間のエッジ、つまり重みを配列の昇順に並べ、配列から順番に変数を取り出して木を作り、取り除いたエッジが循環を形成する場合はそのエッジを破棄します。サイクルを形成しない場合は、n-1 個のエッジでスパニング ツリーが完成するまで追加します。
このアルゴリズムは、エッジが比較的少ないまばらなグラフに適しています。
プリムのルール: これも貪欲な考え方に基づいており、具体的なアルゴリズムのアイデアは次のとおりです。
点をランダムに選択し、その点に最も近い点を選択してセットに追加し、次にセットに最も近い点を見つけてセットに追加し、セット内の点の数が n になるまで検索を続けます。ツリーが完成しました。
このアルゴリズムは、多くのエッジを持つ密なグラフに適しています。
バイナリソートツリーとバランスドバイナリツリー
バイナリソートツリーは、各ノードの左の子はノードより小さく、右の子はノードより大きい、見つけやすいデータ構造です。順序付けられた配置は、順序トラバーサルによって取得できます。挿入、検索、削除の速度は Log2N です。
バランスの取れた二分木とは、ノードの左右の子の高さの差の絶対値が 1 を超えることができないことを意味します。ツリー構造を維持し、検索速度を向上させるために、バランスのとれたバイナリ ツリーが作成されます。ソートツリーがリンクされたリストに変質するのを防ぎます。
AVL調整プロセス:
ノードを削除します。葉ノードの場合は直接削除します。部分木が 1 つしかない場合は、直接部分木に置き換えます。左右両方の子がある場合は、上位の部分木の葉ノードを選択して置き換えます。削除されたノードを削除します。
それらはすべて、最初に上から下までバランス係数を判断し、不均衡なサブツリーを見つけて、調整のためにルート ノードから 3 つのノードを選択します。
バイナリソートツリーのいくつかの調整方法:
左利きの LL は、右側の子の右側のサブツリーにノードを挿入するため、不均衡が生じます。
- 右回転 RR は、左側の子の左側のサブツリーにノードを挿入するため、不均衡が生じます。
- 左右の LR は、左側の子の右側のサブツリーにノードを挿入するため、不均衡が生じます。
- 右-左 RL は右の子の左のサブツリーにノードを挿入するため、不均衡が生じます。
8 つの主要な並べ替えアルゴリズム
[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-mMuhTmim-1661000957154)(%E7%BA%A2%E9%BB%91) %E6%A0%91.assets/image-20220722110258118.png)]
挿入ソート:
- 直接挿入ソート
平均時間計算量は O(N2) で、以前にソートされたシーケンスにソート対象の要素を挿入するという考え方です。要素自体が順序付けされている場合、時間計算量は少なくとも O(N) になります。
- ヒルソート:
実際には、これは特別な挿入ソートです。増分を設定することによって要素を複数のグループに分割します。各グループがソートされ、次に増分が半分になり、次にグループがソートされます。増分が 1 に減少すると、それはソートされます。縮退して直接挿入ソートとなります。
交換ソート:
-
バブルソート
名前が示すように、要素は順番に比較され、継続的に後退されます。バブリング条件が満たされない場合、最終位置が決定されます。平均時間計算量も O(N2) で、最小時間計算量は O(N )。
-
クイックソート
これは、平均時間計算量が (NlogN) である不安定な並べ替え手法であり、分割統治の考えに基づいています。任意の要素をピボットとして選択し、1 回の並べ替えで並べ替えられたリストを 2 つの独立した部分に分割します。並べ替えごとに要素の最終的な位置が決定されるため、要素の前の要素は要素より小さくなり、要素の後ろの要素は小さくなります。それよりも大きいです。サブリストを再帰的にすばやく並べ替えます。
選択ソート
-
単純な選択ソート
名前が示すように、毎回最小の数字が選択され、対応する位置に配置されるため、シーケンスは徐々に整然としたものになります。
-
ヒープソート
小さな根山と大きな根山。小さなルート ヒープは、すべての子要素がルート ノードより大きいという要件を満たしますが、大きなルート ヒープはその逆を満たします。プロパティには、ヒープの最上位要素の最大値または最小値が含まれます。配列に格納されたヒープは、左の子の添字が 2n+1 に等しく、右の子のノードの添字が 2n+2 であることを満たします。
次に、並べ替えプロセスでは、各子ノードとその親ノードを比較し、親ノードより大きい場合は交換します。そして、親ノード未満になるまで交換操作を再帰的に実行します。このプロセスは落下と呼ばれます。
要素を挿入するプロセスでは、要素を最後に配置してからドロップします。
ヒープの先頭要素を削除するとは、ヒープの先頭要素を最後の要素と交換し、削除後に最後の要素を削除することを意味します。
マージソート
ソートのマージの考え方は、順序付きリストをマージして、より大きな順序付きリストを取得することです。マージするときは、2 つ以上の順序付きリストの最初の要素を比較し、新しい順序付きリストに入れる最小の要素を選択するだけで済みます。リスト。マージ ソートでは、最初に各要素を順序付きリストとして扱い、次にそれらを 2 つずつマージし、最後に再帰操作によって大きな順序付きリストにマージします。いわゆる分割統治の考え方は、大きな問題を無数の小さな問題に再帰的に分割して解決するというものです。
バケットソート
基数ソートを拡張したもので、分割統治の考え方を利用し、対応する範囲のバケットに要素を入れ、各バケット内の要素をソートして要素を取り出すものです。
基数ソート
二分探索のプロセスを簡単に説明します
二分検索 (半検索とも呼ばれます) は、順序付きリストに適しています。最初に中央の要素と比較するという考え方です。要素より小さい場合は前半で検索されます。要素より大きい場合は、後半で検索されます。このようにして、検索範囲は継続的に狭められ、平均検索時間の複雑さは log2N になります。
スタックとキューの違いは何ですか?
スタックは、その上にポインタがある線形構造 (データ項目の順序付けされたコレクション) です。特徴は、要素が一方の端で挿入され、もう一方の端で要素が削除されることです (先入れ後出し)。
キューは、先頭ポインターと末尾ポインターを備えた線形構造です。特徴は、要素が一方の端で挿入され、もう一方の端で削除される、先入れ先出しであることです。
学生番号から最も早く名前を見つけるにはどのようなデータ構造が使用されますか?
ハッシュ テーブルを介した時間計算量は O(1) です。これは、ハッシュ テーブルの格納原理は、ハッシュ アルゴリズムを使用して、格納された添え字値であるハッシュ コードを取得し、その値を対応する位置に配置することであるためです。保管場所です。ハッシュ テーブルは本質的には配列です。
大量のデータを並べ替えるには、次を使用します。
ハーフサーチ使用時にデータの削除、挿入を行う際に位置を移動する必要があるのですが、もっと効率的な方法はありますか?
ハーフサーチは実際にバイナリソートツリーを構築するため、バイナリソートツリーを使用してシーケンスを保存でき、追加および削除するときにはるかに便利になります。
何百万人もの受験者の結果を並べ替える
バケット ソートを使用する欠点は、多くの余分なスペースを消費することですが、時間計算量は O(N+M) と低く、n は要素の数、M はバケットの数、時間計算量は O です。 (k*N). 基数ソートの時間計算量もこれです
高性能コンピューターを使用して平均時間計算量を確認すると、ヒープ ソート、バケット ソート、およびマージ ソートの時間計算量はさらに低くなります。
自分でデザインしたらどうでしょうか?
KMP アルゴリズムを簡単に説明する
完全なバイナリ ツリー: 名前が示すように、リーフ ノードに子ノードがないことを除いて、各レベルには 2 つの子ノードがあります。
順序付きクイックソートの場合、単一分岐ツリーに縮退し、時間計算量は O(N2) になります。
データ構造とは何か、データ構造とアルゴリズムの関係(よくわからない)
プログラム = データ構造 + アルゴリズム。
データ構造とアルゴリズムの関係は、データ構造が最下層、アルゴリズムが上位層、データ構造がアルゴリズムの役割を果たし、アルゴリズムがデータ構造を中心に動作するというものです。このアルゴリズムは、特定のアプリケーション シナリオに適したデータ構造を選択します。たとえば、データの削除と挿入操作が多いシナリオでは、リンク リストのデータ構造が適しており、データの読み取り数が多い場合は、配列のデータ構造が適しています。適切な構造です。
データ構造:データは独立して存在するのではなく、データ間には関係があり、この関係を構造といいます。データ構造には、論理構造、記憶構造、データ操作の 3 つの側面が含まれます。アルゴリズムの設計は選択された論理構造に依存し、アルゴリズムの実装は使用されるストレージ構造に依存します。
コンピュータネットワークやオペレーティングシステムにおけるデータ構造の応用は何ですか?
- オペレーティング システム: プロセスのスケジューリングはスタックとキューに適用され、ファイル管理はツリー、グラフ、並べ替えに適用され、情報ストレージは線形リストと文字列に適用されます。
- コンピュータ ネットワーク: グループ化と転送にはキューとグラフが使用されます。DNS 解析はツリーに適用され、情報を表すために線形テーブルが使用されます。
リンクされたリストと配列の類似点と相違点は何ですか?
類似点: どちらも線形構造を表すことができ、リンク リストは前のノードから次のノードを指しますが、配列はメモリに順番に格納されます。
違いは、配列に格納されているデータの物理アドレスは連続しているのに対し、リンク リストに格納されているデータの物理位置は連続ではなく、各ノードのポインタによって次のノードを指していることです。リンク リストはデータの挿入と削除に適しており、配列はデータの検索に適しています。
構造とは何ですか?
基本的なデータ構造で構成されるカスタム データ構造
二分木と子が 2 つだけある木の違いは何ですか?
バイナリ ツリー内の各要素のサブツリーは順序付けされています。つまり、左側と右側のサブツリーによって区別できます。木の二人の子供たちには右も左もありません。
再帰的に階乗を求める
int fact(int n){
if(n==1){
return 1;
}else{
return n*fact(n-1);
}
}
ツリーの階層トラバースを実行します。
キューを使用してトラバース (幅優先検索トラバーサル) し、ルート ノードをキューに入れてからデキューできます。デキューするたびに、すべてのノードが完了するまで、子ノードを順番にキューに入れる必要があります。がデキューされ、キューにノードが入れられなくなると、レベルのトラバーサルが完了します。
数値配列をソートするために使用される方法
- n が比較的小さい場合は、直接挿入ソートまたは単純選択ソートを使用します。
- 配列が基本的に正しい場合は、直接挿入またはバブル ソートを使用します。
- n が比較的大きい場合は、クイック ソート、ヒープ ソート、およびマージ ソートを使用します。
- n が大きい場合は、基数ソートが使用されます。
ハフマン木とは何ですか? 効果は何ですか
ハフマン ツリー: n 個の重み付きリーフ ノードで構成されるすべてのバイナリ ツリーの中で、最も短い重み付きパス長を持つバイナリ ツリー。
ハフマンコーディング: n 個の葉ノードを持つハフマン ツリーの場合、ツリーの各左枝に 0 が割り当てられ、右枝に 1 が割り当てられる場合、ルートから各葉までのパスは、バイナリ文字列を構成します。ハフマン コーディングと呼ばれます。は最適なプレフィックス コード (各コードを他のコードのプレフィックスと呼ぶことはできません) であり、データ圧縮によく使用されます。
ヒープストレージ構造
物理的な記憶構造は配列であり、論理的な記憶構造はツリーです。
ハッシュの競合とその解決方法
ハッシュの競合とは、異なる値が同じ値にマッピングされる状況を指します
競合解決方法にはジッパー方式とオープンアドレス方式があります。
- オープンアドレス:
- 線形プローブ: 後続のストレージ ユニットに競合する値を配置します。
- 正方形の検出: 値が矛盾するユニットを中央に配置し、両側の正方形の番号で適切なストレージ ユニットを検索します。
- 再ハッシュ: 処理用の 2 番目のハッシュ関数を作成します。
- ジッパー メソッド。ポインタを使用して競合する値を接続します。
完全なバイナリ ツリーの高さ: n 個のノードがあり、高さは log2(n+1) です。
単一リンクリスト内の中間ノードを検索する
高速ポインタと低速ポインタにより、低速ポインタは一度に 1 ノードずつ移動し、高速ポインタは一度に 2 ノードを移動し、高速ポインタが最後に到達すると、低速ポインタは中間位置に到達します。
二分探索木と配列で実装した二分探索の違い
二分探索ツリーは、データの挿入と削除を容易にする動的検索ですが、二分探索は静的検索であるため、データの削除には不便です。
最短経路?
ディクストラ (貪欲な思考に基づく)
必須: Visited[]、D[]、path[]、arcs[] [];
訪問したノードをそれぞれ参照し、次に残りのノード、対応するノードへの最短経路を記録に使用し、最後に 2 次元配列を使用してノード間の関係 (経路長) を表現します。
比較を繰り返すたびに、到達可能なノードまでの距離がリストされ、最短距離で到達できるノードが Vist セットに追加され、D の残りのノードまでの距離がリストされます。なぜなら、新しいノードが追加されるたびにパスが更新されますが、残りのノード セットが空になるまでそのたびに最短パスを持つノードが参加するように選択され、そのパスは最短パスのままになります。
フロイトのアルゴリズム
考え方はより単純で、動的計画法の考え方を使用しており、時間計算量は O(N3) です。
3 レベルのループを通じて 2 次元配列の記録距離を更新します
伝達方程式は a[i] [j]=min(a[i] [j], a[i] [k]+a[k] [i]) です。
最小スパニングツリー:
点を追加する方法である Prim は、まずランダムに点を選択して訪問ノードのセットに追加し、次にそのノードに最も近いノード、つまり重みが最も小さいノードを残りのノードから選択して結合します。すべてのノードがアクセスされるまで続きます。
クラスカルのアルゴリズム (エッジ追加法): 深い森をツリーに継続的にマージし、グラフ内のエッジを小さいものから大きいものに並べ替え、最小のエッジを選択し、それに対応するノードを訪問ノード セットに追加するプロセスです。すべてのノードをセットに追加するまでですが、この過程で追加されたエッジが循環を形成しているかどうかを判断する必要があり、これには和集合検索の方法と、ノードがすでに同じツリー内に存在するかどうかを判断する必要があります。ノードには一貫性があり、最初は各ノードの祖先がそれ自体になります。
KMPアルゴリズム
このアルゴリズムは、メイン文字列に含まれる文字列を検索する文字列マッチング アルゴリズムです。
従来の総当り的な解決方法は、文字列ごとにポインタを設定し、最初から開始して、1つずつ連続的に移動して比較し、異なる場合は2つの文字列のポインタを先頭に戻し、メインの文字列に戻します。文字列は 1 ステップ進みます。このアルゴリズムは時間複素数です。次数は O(N*M)、
KMP、アルゴリズムの時間責任は O(M*N) です。主に、マッチング プロセス中に文字列の繰り返しプレフィックスを使用します。失敗情報を使用して、毎回マッチングをやり直すことを避けます。マッチングの鍵は次のとおりです。配列を作成し、各配列には、一致に失敗した後に一致が開始される位置が記録されます。
次の配列の解決策は動的プログラミングです
最長の共通プレフィックスとサフィックスを見つけて文字列の共通プレフィックスを決定する方法は、それらを順番に比較することです。
k 番目の要素の最長のサフィックスのキー コード:
S は文字列配列を表し、next はレコードの配列を表します。
next(k) = S[k]==S[0+next[k-1] ] ? 次(k-1)+1 : 0