マインドマップギャラリー プログラマーが面接中に習得しなければならない 8 つのデータ構造
プログラマーがインタビューで習得しなければならない 8 つのデータ構造。たとえば、キュー: 線形データ構造を格納するための FIFO 先入れ先出し順序、スーパーマーケットのレジ、それができるかどうかを確認してください。
2023-10-11 09:57:06 に編集されましたデータ構造
グラフ、あまりテストされていない
意味
ネットワークの形で相互に接続されたノード
用語
頂点: ノード
エッジ: エッジ、ノードのペア
重量/コスト
タイプ
有向グラフ
無向グラフ
表現
隣接行列
隣接リスト
トラバーサルアルゴリズム
幅優先検索 DFS
深さ優先検索 TFS
インタビュー関連
幅と深さの優先検索を実装する
グラフがツリーであるかどうかを確認する
グラフ内のエッジの数を数える
2 つの頂点間の最短距離を見つける
モノトーン スタック モノトーン スタックはほとんどテストされません
両端キュー Deque、ほとんどテストされない
Union Find はほとんどテストされません
線分ツリーはほとんどテストされません
ツリー配列バイナリ インデックス付きツリー、BIT、ほとんどテストされない
辞書ツリーのトライ、ほとんどテストされない
意味
別名: プレフィックス ツリー、特別なツリー状のデータ構造
使用
文字列関連の問題を解決するのに非常に効果的です
クイック検索を提供する
辞書で単語を検索する
検索エンジンの自動候補
IPのルーティング
インタビュー
辞書ツリー内の単語の総数をカウントします。
辞書ツリーに保存されているすべての単語を出力します
辞書ツリーを使用して配列内の要素を並べ替える
辞書ツリーを使用して辞書から単語を作成する
T9 辞書の構築: 辞書ツリー DFS
ハッシュ テーブル/ハッシュ マップ 頻繁にテストされるハッシュ テーブル
意味
一意に識別されたオブジェクトをキーと値のペアの形式で保存します
ディクショナリ: キーと値のペアのコレクション
キー key を使用してオブジェクトの値を検索する
Java の HashSet/HashMap、C の unowned_map、Python の dict
サポートされている操作: O(1) 挿入 / O(1) 検索 / O(1) 削除
ハッシュテーブルの仕組み
<br>動作原理: セット用。キーはハッシュ関数を通じてインデックスを取得し、値が配列に格納されます。 <br>get の場合は、キー関数とハッシュ関数を使用してインデックスを検索し、値を取得します。
ハッシュに対するさまざまな演算の時間計算量を単純に O(1) と見なすことができないのはなぜでしょうか?
キーには、文字列、整数、または長さが不明なものを指定できます。したがって、厳密な意味では O(L) を使用するのが適切です。つまり、操作の時間計算量は O(1) ではなく O(keySize) です。<br>
ハッシュ関数の実装方法
128 ハッシュ関数
ハッシュの衝突(Collision)を解決する方法
衝突とは、2 つの異なるキーがハッシュ関数による計算後に 2 つの同一の値を取得することを意味します。競合を解決するには主に 2 つの方法があります:<br>オープン ハッシュ。これは、ハッシュ テーブルの基になる配列において、各位置がリンク リストの先頭ノードであることを意味します。このようにして、競合する <key, value> タプルが同じリンク リストに配置されます。 <br>クローズドハッシュ。つまり、競合が発生すると、後続の要素は空いたスペースを見つけるために次の位置に移動します<br>
ハッシュテーブルを継続的に拡張するにはどうすればよいですか?
129 リハッシュ
パフォーマンス要因
ハッシュ関数
ハッシュテーブルのサイズ
衝突処理方法
インタビュー
配列内の対称キーと値のペアを検索する
問題を解決するためにハッシュ テーブルを柔軟に使用できるでしょうか?
あなたはハッシュ テーブルの基本原理を理解していますか?
便宜上、完全なパスを追跡します
配列が別の配列のサブセットであるかどうかを調べる
指定された配列が互いに素であるかどうかをチェックします
526. ロードバランサ<br>
134. LRU キャッシュ戦略<br>657. 挿入 削除 GetRandom O(1) - 重複は許可されます<br>209. 1 回だけ出現する最初の文字。
データストリームクラスの問題<br>960. ストリーム内の最初の一意の番号 II<br>138. ランダムなポインタを含むリンクリストのコピー<br>171. 124. 最長連続シーケンス
並べ替え検索
選別
挿入ソート
クイックソート
選択ソート
マージソート
基数ソート
ヒープソート
探す
静的ルックアップテーブル
動的ルックアップテーブル
ハッシュ表
データ構造の定義: データ構造は、データ ストレージ コレクションと、このコレクションに対して定義されたいくつかの操作 (関数) として考えることができます。
テスト方法 1: 特定のデータ構造の基本原理を尋ね、その実装を尋ねる
例: ハッシュの原理について話し、ハッシュ テーブルを実装する
テスト方法 2: ある種のデータ構造を使用して作業を完了する
例: K 個の順序付けされた配列をマージする
テスト方法 3: いくつかの特定の機能を提供するデータ構造を実装する
例: 最高頻度 K 個の問題
時間計算量:
複数のインターフェースの時間計算量を説明する<br>
たとえば、Set データ構造を設計する必要があります。
アルゴリズム 1:O(n) lowerBound O(1) 加算
実装方法: 配列ストレージを使用し、毎回比較し、配列の末尾に直接挿入します
アルゴリズム 2:O(logn) lowerBound O(logn) 加算
実装方法:Red-black Treeストレージ、JavaのTreeSet、Cのマップを使用
配列 配列、最も一般的にテストされる
タイプ
一次元配列
二次元配列
多次元配列
サブアレイ
配列の一部
面接の質問
41. 42,43、最大部分配列<br>44. 最小部分配列<br>138.
配列間隔の問題
面接の質問
30. 範囲の挿入<br>793. 複数の配列の交差<br>156.
外部ソートの問題
定義: 外部並べ替えアルゴリズムとは、メモリが不足している場合に、1 つ以上の大きなファイルに格納されているデータを並べ替えるためのアルゴリズムを指します。 <br>
2 つの基本的な手順:<br>大きなファイルを複数の小さなファイルに分割し、メモリを使用してそれぞれを並べ替えます<br>K ウェイ マージ アルゴリズム (k-way マージ) を使用して、複数の小さなファイルを並べ替えて 1 つの大きなファイルにマージします
面接の質問
486. K 個のソートされた配列をマージする<br>104. K 個のソートされたリストをマージする
ビット演算
定義: バイナリ ビットの演算
面接の質問
365. 2進数には1はいくつありますか<br>
ツリー配列はほとんど考慮されません
別名:フェンウィックツリー 英語名:Binary Indexed Tree 略語:BITはプレフィックスと情報に基づいて実装されます<br>
名前はTreeですが配列(Array)に格納します<br>BITはマルチツリーで親子関係は包含関係を表します<br>getPrefixSum(k)を使ってgetRangeSum(x, y)を実装します)
時間の複雑さ
Log(n) 任意の位置の値を変更します<br>Log(n) 任意の間隔の合計をクエリします
特徴
N 個の数値を持つ配列の場合、次の関数がサポートされています。<br>update(index, val) //logN 時間以内に配列内の位置の値を更新します getPrefixSum(k) //log(K) 時間以内に値を取得します配列内の最初の K 個の数値の合計
面接の質問
817. 範囲行列要素の合計変数<br>249. 自分より小さい前の数値の数を数えます。
操作する
増やす
削除削除
インサートインサート、
サイズサイズ
インタビュー関連
配列内で 2 番目に小さい要素を検索します
最初の非繰り返し整数を検索する
配列内の正の値と負の値を並べ替えます
65. ソートされた 2 つの配列の中央値、難しい問題<br>
6. ソートされた配列のマージ II<br>64. ソートされた配列のマージ<br>839. 2 つのソートされた間隔リストのマージ<br>577. K のソートされた間隔リストのマージ。 2 つの配列<br>548. 2 つの配列の交差 II<br>793. 複数の配列の交差<br>931. K ソートされた配列の中央値<br>149.時間<br>405.合計がゼロである部分行列<br>943.不変範囲合計クエリー 665.
スタック スタック、あまりテストされていない
意味
LIFO。例えば、物流の積み込みでは、後から積んだ商品を先に降ろします。
サポートされている操作: O(1) プッシュ / O(1) ポップ / O(1) トップ
応用
バイナリ ツリーの非再帰的走査、逆ポーランド式の計算などに使用されます。
DFS の非再帰実装の主なデータ構造
幅優先探索 (BFS) では、展開されるノードが記録されます。
キューを使用してメッセージ キューを実装し、非同期タスクを完了できます。
メッセージの生成と消費の速度が一貫していない場合は、送信されたが受信されていないメッセージを一時的に保存するメッセージ キューが必要になります。
スタックモードの実装
要素を格納するにはストレージ構造 (一般的に使用される配列、場合によってはリンクされたリスト) を使用します。
1 つの配列を使用して 3 つのスタックを実装しますか?
2 つのキューを使用してスタックを実装しますか? <br>
違い
配列はランダムアクセスのパフォーマンスが優れています。 <br>リンクされたリストは、要素の挿入と削除のパフォーマンスが向上します。
演習<br>
lintcode: 495. スタックを実装する
494. デュアルキュー実装スタック<br>
224. 配列を使用して 3 つのスタックを実装します<br>
操作する
プッシュして、要素を上部に挿入します
Pop はスタックの最上位要素を返して削除します
isEmptyスタックは空であり、trueを返します
top は、先頭の要素を削除せずに返します。
Java は、Vector クラスから拡張された java.util.Stack を使用し、push()、pop()、peek()、empty()、search() などの操作をサポートします。
C の場合は、<stack> でスタックを使用するだけです。このメソッドは Java と似ていますが、C の Peak() が top() と呼ばれ、pop() の場合の戻り値が空である点が異なります。
Python、リストを直接使用し、[-1] などのスライス操作を使用してスタックの最上位を表示し、スタックの最上位をポップする場合は list.pop() を使用し、スタックの最上位をプッシュする場合は list.append() を使用します。 。 <br>
インタビュー関連
スタックを使用して後置式を評価する
スタックの要素を並べ替える
式が括弧内でバランスが取れているかどうかを判断する
QueueQueue、頻繁にテストされる
意味
FIFO先入れ先出しシーケンシャルストレージ線形データ構造、スーパーマーケットのチェックアウト
サポートされている操作: O(1) プッシュ / O(1) ポップ / O(1) トップ
応用
BFS アルゴリズムのメイン データ構造として使用されます。
操作する
エンキューキューの最後に要素を挿入します
デキューはキューの先頭要素を削除します
isEmpty 列は空であり、true を返します
top はキューの最初の要素を返します
実現方法
リンクリストを使用してキューを実装しますか?
2 つのスタックを持つキューを実装しますか? <br>
循環配列を使用してキューを実装しますか?
演習: 955. 円形配列によるキューの実装<br>
インタビュー
キューを使用してスタックを表す
キューの最初の k 要素を反転します
キューを使用して 1 から n までの 2 進数を生成する
642. データストリームからの移動平均<br>
955. 円形配列によるキューの実装<br>
リンクされたリスト、頻繁にテストされる
意味
ノードチェーン: 各ノードにはデータと後続のノードへのポインタが含まれます。
使用
ファイルシステム、ハッシュテーブル、隣接関係リストを実装する
タイプ
一方向リンクリスト
二重リンクリスト
操作する
最後に挿入
頭に挿入
消去
先頭で削除
検索
isEmpty、空です、trueを返します
インタビュー
逆リンクリスト
リンクされたリスト内のサイクルを検出する
リンクされたリストの最後から n 番目のノードを返します。
リンクされたリストから重複を削除する
木木
意味
階層データ構造
頂点とエッジで構成されています
グラフに示されているように、ツリーにはサイクルがありません。
用語
ルート ルートノード
親親ノード
子 子ノード
リーフノード
兄弟 兄弟ノード
タイプ
N分木
線分ツリーは基本的にテストされておらず、汎用です。
二分木、頻繁にテストされる
二分探索木
定義: 左側のサブツリーはルート ノードより小さく、ルート ノードは右側のサブツリーより小さくなります。その結果、左側は常に右側よりも小さくなります。
バランスの取れた二分木
バランスツリー(AVLツリー)
意味:
これは空のツリーであるか、その左右のサブツリー間の高さの差の絶対値が 1 を超えず、左右のサブツリーは両方ともバランスのとれた二分木です。
実装
赤黒木、AVL、スケープゴートツリー、トレプ、スプレッドツリー
ヒープ
定義: ヒープは、親ノードが子ノードよりも小さく、左側の子ノードと右側の子ノードの間にはサイズ関係がありません。配列を使用して実装可能<br>
サポートされている操作: O(log N) 追加 / O(log N) 削除 / O(1) 最小値または最大値
最大ヒープと最小ヒープ
値の特性: 最小ヒープの場合、親ノードは子ノードより小さく、最大タイプのヒープの場合、親ノードは子ノードより大きく、左右の子ノード間にサイズ関係はありません。左右の子ノード間にはサイズ関係がありません。
構造的特徴:高さlogNの二分木です
時間計算量: 削除とポップの計算量はすべて logN、find の最小計算量、または最大計算量 O(1) です。<br>
挿入方法: 常に左から挿入し、挿入された数が小さい場合は上に移動し、親ノードが下に移動します。したがって、最大複雑度は logN です<br>
削除方法は同様です
実装方法:演習:lintcode 130 heapify<br>
面接の練習問題
104. K のソートされたリストのマージ<br>612. K の最も近いポイント<br>545. 優れた結果 K のソートされた配列<br>81。桁<br>544。上位 K の大きい数値<br>並べ替え行列内の小さい値から大きい値までの k 番目の数値。
セグメントツリー<br>
定義: 線分ツリーは高度なデータ構造であり、ツリー構造であり、正確には二分木です。間隔変更クエリなどの問題を効率的に処理できます。 <br>
注: 基本的にはテストされていませんが、使いこなすことができれば、一度に多くの問題を解決することができます。線分ツリーは分割統治法に基づいて実装されており、分割の良い練習として使用できます。そして攻略法。
インタビュー
二分木の高さを求める
二分探索木で k 番目の最大値を見つける
ルートノードから距離kのノードを見つけます
バイナリ ツリー内の指定されたノードの祖先ノードを検索します。
104. K 個のソートされたリストを結合する<br>
3つの方法
方法 1: PriorityQueue を使用する
方法 2: マージ ソートに似た分割統治アルゴリズム
方法 3: ボトムアップのペアワイズ マージ アルゴリズム
時間計算量は O(NlogK)
組み合わせ: Jiuzhang アルゴリズム
練習問題はすべて lintcode の問題です