Interactive

ヒープ可視化

二分ヒープは「親は子以下」というヒープ条件と、隙間なく詰まった完全二分木という形を保つことで、配列1本だけでポインタなしに表現できます(添字iの親は(i-1)/2、子は2i+12i+2)。 木構造と配列表示を同時に見ながら、挿入時のsift-up(上方修正)、 最小取り出し時のsift-down(下方修正)、 そして未整列配列から一気に組むビルドヒープ(O(n))をステップ再生できます。

13249875

同じ状態を配列(index 0始まり)で見ると

01
13
22
34
49
58
67
75
1 / 1
完了

初期状態(8要素をビルドヒープ済み)

ここから挿入・取り出し・ビルドヒープを試せます。

ここが分かる

  • ヒープ条件は「親≤子」だけ——二分探索木と違って兄弟同士の大小は問わない。だから根の最小値はO(1)で覗けるが、k番目の最小を探すのは苦手で、ソート済みの列挙もできない。
  • 取り出し(sift-down)で2人の子のうち必ず小さい方と比較・交換するのが鉄則——大きい方と交換すると、その枝でヒープ条件がさらに崩れて修復が破綻する。
  • ビルドヒープが1要素ずつ挿入するより速いO(n)で済むのは、数が多い下段のノードほど高さが低くsift-downのコストがほとんどかからないから——逆に上から積む方式だと下段ノードが最大の高さを登るため、O(n log n)に戻ってしまう。