【ひーぷ】

ヒープ とは?

最終更新:
💡 「一番大きい(小さい)もの」を常にトップに置く

最大値や最小値を取り出すために使うデータ構造。代表的な二分ヒープは、親の値が子の値以上(または以下)という条件を満たす完全二分木で、優先度付きキューの実装に使われる。

📌 このページのポイント
二分ヒープ:親と子の大小関係を保つ最大ヒープ最小ヒープ9070503060201010302070506090親 ≧ 子親 ≦ 子根が最大・最小。枝全体の並び順は不要
同じ7個の値で作った完全二分木の例。線は親子関係を表し、値の移動順ではありません。同じ値を含んでも親子の条件を満たせます。
ひよこ ひよこ
普通のソートと何が違うの?
ペンギン先生 ペンギン先生
ソートは全体を順に並べるけれど、ヒープは先頭で最大値や最小値を取り出しやすく保つよ。二分ヒープでは親と子の大小関係を守る。同じ親を持つ子同士や、離れた枝の値まで順番に並べる必要はないんだ
ひよこ ひよこ
木の形にも決まりがあるの?
ペンギン先生 ペンギン先生
二分ヒープは完全二分木で、上の段から埋め、最後の段は左から詰めるよ。配列にも表せる。最大ヒープでは親が子以上、最小ヒープでは親が子以下なので、同じ値があっても大丈夫なんだ
ひよこ ひよこ
優先度付きキューって何?
ペンギン先生 ペンギン先生
追加した順ではなく、優先度で次の要素を取り出す仕組みだよ。ヒープはその実装方法の一つ。根を取り出したり要素を追加したりした後には、親子の条件を満たすよう位置を調整するんだ
ひよこ ひよこ
ヒープソートって速いの?
ペンギン先生 ペンギン先生
配列内でヒープを作って順に取り出す実装なら、最悪でもO(n log n)の時間で、追加領域はO(1)にできるよ。ヒープ用に別の配列を作る実装とは区別しよう。実際の速度はデータや実装によるので、他のソートより必ず速いとは言えないね
ひよこ ひよこ
メモリ管理の「ヒープ領域」とは別物?
ペンギン先生 ペンギン先生
同じ名前だけれど、ここで説明したデータ構造とは別の意味だよ。メモリー管理では、実行中に必要な領域を確保して使う仕組みを指す。例えばWindowsのHeapAllocは、ヒープからメモリーのブロックを確保するんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ヒープ」って出てきたら「最大値や最小値を取り出しやすく保つデータ構造」と思えばだいたいOK!
📖 おまけ:英語の意味
「Heap」 = 山積み
💬 英語では山積みという意味だよ。ここではデータ構造を指し、メモリー管理のヒープとは意味が違うんだ

参考資料

← 用語集にもどる