最小ヒープ:挿入、最小値の抽出、ヒープ化操作
バブルアップによる挿入、バブルダウンによる最小値抽出、ヒープ構築を含む最小ヒープ操作をマスターします。配列表現とヒープがポインタなしで格納される理由を理解します。
Heap
詳細な説明
最小ヒープの操作
最小ヒープは、すべての親が子以下である完全二分木です。最小要素は常にルートにあります。
配列表現
ヒープはポインタの代わりにインデックス計算を使用して配列として格納されます:
ノードiの親: floor((i - 1) / 2)
ノードiの左の子: 2 * i + 1
ノードiの右の子: 2 * i + 2
挿入 — O(log n)
- 配列の末尾に新しい要素を追加。
- バブルアップ:親と比較。小さければ交換。ヒープ特性が回復するまで繰り返し。
最小値の抽出 — O(log n)
- ルート(最小要素)を削除。
- 最後の要素をルートに移動。
- バブルダウン:子と比較。より小さい子と交換。繰り返し。
ヒープ構築 — O(n)
未ソートの配列からヒープを構築するのは**O(n)**であり、O(n log n)ではありません。最後の非葉ノードから開始し、各ノードに下から上にバブルダウンを適用します。
Peek — O(1)
最小値は常にインデックス0にあります。走査不要。
ユースケース
最小ヒープはDijkstraの最短経路アルゴリズム、A*探索、ハフマン符号化、イベント駆動シミュレーションに不可欠な優先度キューの実装に使用されます。OSはタイマー管理に最小ヒープを使用します。ヒープ操作の理解は基本的な面接トピックです。