二分ヒープ
「親は子より大きい」を保つ木 ── 常に最大値が根にあるデータ構造を、木と配列の両方で見ます。
0
木としてのヒープ
配列としてのヒープ(同じものを 1 次元で)
取り出した最大値(大きい順に出てくる)
二分ヒープ(最大ヒープ)は、どの親も自分の子より大きい完全二分木です。
だから根が常に全体の最大値。優先度つきキューやヒープソートの土台になります。
木はそのまま 配列で表せます ── 添字 i の子は
挿入は「末尾に足して親と比べ、大きければ上へ(sift-up)」、最大値の取り出しは「根と末尾を入れ替えて末尾を削り、 根を子と比べて下へ(sift-down)」。木と配列が連動して動く様子を見てください。
木はそのまま 配列で表せます ── 添字 i の子は
2i+1 と 2i+2、親は (i−1)÷2。挿入は「末尾に足して親と比べ、大きければ上へ(sift-up)」、最大値の取り出しは「根と末尾を入れ替えて末尾を削り、 根を子と比べて下へ(sift-down)」。木と配列が連動して動く様子を見てください。
いま何をしている?
ここがポイント
- 根は常に最大値。挿入も取り出しも木の高さぶん= O(log n)。
- 完全二分木なので 配列だけで表現できる(ポインタ不要)。
- 取り出しを繰り返すと大きい順に出てくる ── これが ヒープソート。