Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

ヒープ

ヒープ(Heap) は、ヒープ条件 を満たす完全二分木ベースのデータ構造。

  • 最小ヒープ(min-heap): 親ノードの値 ≤ 子ノードの値(根が最小値)

  • 最大ヒープ(max-heap): 親ノードの値 ≥ 子ノードの値(根が最大値)

ヒープは配列で効率的に表現できる。インデックス ii のノードに対して:

  • 左の子: 2i+12i + 1

  • 右の子: 2i+22i + 2

  • 親: ⌊(i−1)/2⌋\lfloor (i-1)/2 \rfloor

主な操作の計算量:

操作計算量
push (挿入)O(log⁡n)O(\log n)
pop (最小/最大値取り出し)O(log⁡n)O(\log n)
peek (最小/最大値参照)O(1)O(1)
heapify (配列からヒープ構築)O(n)O(n)

ヒープの操作

push(挿入)

  1. 末尾に要素を追加する

  2. ヒープ条件を満たすまで親と交換しながら上に移動(sift up / bubble up)

pop(取り出し)

  1. 根(最小/最大値)を取り出す

  2. 末尾要素を根に移動する

  3. ヒープ条件を満たすまで子と交換しながら下に移動(sift down / bubble down)

最小ヒープの実装

peek: 1
pop: 1
pop: 3
pop: 4
内部配列: [5, 8]

heapify — O(n)O(n) でのヒープ構築

配列の末尾から各内部ノードに sift_down を適用することで、O(n)O(n) でヒープを構築できる。

要素を1つずつ push する O(nlog⁡n)O(n \log n) より効率的。

内部配列: [1, 3, 2, 5, 4, 8, 7]
ソート結果: [1, 2, 3, 4, 5, 7, 8]

Python の heapq モジュール

Python 標準ライブラリの heapq は最小ヒープを提供する。リストをヒープとして操作する関数群。

heapify後: [1, 3, 8, 5, 4]
push(0)後: [0, 3, 1, 5, 4, 8]
pop: 0
pop: 1
heappushpop(0): 0
heappushpop(9): 1
nsmallest(3): [1, 2, 3]
nlargest(3): [8, 7, 5]

ヒープソート

ヒープを利用した比較ベースのソートアルゴリズム。

  • 時間計算量: O(nlog⁡n)O(n \log n)(最悪・平均・最良すべて)

  • 空間計算量: O(1)O(1)(in-place)

  • 安定ソートではない

[1, 2, 3, 4, 5, 7, 8]

活用例

  • 優先度付きキュー: タスクスケジューリング、イベント駆動シミュレーション

  • ダイクストラ法 / A* 法: 最短経路探索

  • K番目の最小/最大値: ストリームデータの上位K件管理

  • 外部マージソート: 大容量データのソート