二分ヒープとしての木 — ヒープ性質の可視化
二分ヒープを完全二分木として可視化します。最大ヒープと最小ヒープの性質、ヒープ操作、配列表現が木構造にどのようにマッピングされるかを理解します。
Data Structures
詳細な説明
二分ヒープとしての木
二分ヒープはヒープ性質を満たす完全二分木です:最大ヒープではすべての親がその子以上、最小ヒープではすべての親がその子以下です。
最大ヒープの例
木のビュー: 配列: [90, 70, 80, 30, 50, 60, 40]
90
/ \
70 80
/ \ / \
30 50 60 40
i の親: floor((i-1)/2)
i の左の子: 2i + 1
i の右の子: 2i + 2
ヒープ操作
挿入(バブルアップ / シフトアップ):
- 末尾に新しい要素を追加
- 親と比較。ヒープ性質に違反する場合、親と交換
- 性質が復元されるかルートに到達するまで繰り返す
- 時間: O(log n)
最大/最小の取り出し(バブルダウン / シフトダウン):
- ルート(最大または最小の要素)を削除
- 最後の要素をルート位置に移動
- 子と比較。大きい(最大ヒープ)または小さい(最小ヒープ)子と交換
- 性質が復元されるまで繰り返す
- 時間: O(log n)
ヒープ構築(Heapify):
- 最後の非リーフノード(インデックス n/2 - 1)から開始
- 各ノードをシフトダウン
- 時間: O(n)
ヒープ vs BST
| 性質 | ヒープ | BST |
|---|---|---|
| 順序付け | 親と子の間のみ | 左 < 親 < 右 |
| 構造 | 完全二分木 | 任意の形状 |
| 最小/最大の検索 | O(1) | O(h) |
| 探索 | O(n) | O(h) |
| 挿入 | O(log n) | O(h) |
ユースケース
二分ヒープは優先度キュー(オペレーティングシステムのタスクスケジューリング、イベント駆動シミュレーション)、ヒープソート(O(n log n) のインプレースソート保証)、Dijkstra の最短経路アルゴリズム、ハフマン符号化(最適接頭辞符号の構築)、データストリームの中央値問題(最大ヒープと最小ヒープの組み合わせ)に使用されます。