目次
はじめに
Pythonのheapqモジュールは、優先度付きキュー(プライオリティキュー)を実現するための標準ライブラリです。このモジュールは、ヒープデータ構造を利用して効率的に要素を追加や削除を行うことができます。特に、要素を最小値から順に取り出す際に強みを発揮します。本記事では、heapqの基本情報、特徴、使い方、そして活用方法について詳しく解説します。
heapqとは?
heapqは、Pythonでヒープキューアルゴリズムを提供するモジュールです。ヒープキューアルゴリズムは、優先度キューアルゴリズムとしても知られており、要素を追加した際に最小値が先頭に来るように整理されます。
heapqの基本情報
- モジュール名: heapq
- 主な機能: 優先度付きキューの実装
- データ構造: ヒープ(二項木構造)
- 特徴: 最小値を効率的に取り出すことができる
heapqの特徴/良い点/悪い点
- 良い点:
- 最小値の取得が高速(計算量O(1))
- 要素の追加や削除が効率的(計算量O(logN))
- ソートされていないリストから小さい順にK個の値を取り出す際に優位
- 悪い点:
- ヒープ構築には初期計算量O(N)が必要
- ソート済みリストから要素を取り出す場合、他の方法と比べて遅い場合がある
heapqの新規作成の方法
新規にheapqを作成するには、まず空のリストを作成し、heapifyメソッドでヒープ化します。以下はサンプルコードです。
import heapq
# 空のリストを作成
hq = []
# リストに要素を追加
hq.append(5)
hq.append(1)
hq.append(3)
# リストをヒープ化
heapq.heapify(hq)
print(hq) # [1, 5, 3]
heapqの作成の方法(他のデータ型からの変換)
既存のリストからheapqを作成する場合も、heapifyメソッドを使用します。
import heapq
# 既存のリスト
numbers = [3, 5, 1, 2, 0]
# リストをヒープ化
heapq.heapify(numbers)
print(numbers) # [0, 2, 1, 5, 3]
heapqの削除の方法
heapqから要素を削除するには、heappopメソッドを使用します。
import heapq
# ヒープ化されたリスト
hq = [1, 5, 3]
# 最小値を削除して取得
min_value = heapq.heappop(hq)
print(min_value) # 1
print(hq) # [3, 5]
heapqの関数一覧
名称 | 機能説明 | 計算量(オーダー) |
---|---|---|
heapify | リストをヒープ化する | O(N) |
heappush | ヒープに要素を追加する | O(logN) |
heappop | ヒープから最小値を削除して返す | O(logN) |
heappushpop | 要素を追加し、最小値を削除して返す | O(logN) |
heapreplace | 最小値を削除し、新しい要素を追加する | O(logN) |
heapqの比較
- heapq vs sort: 小さい順にK個の値を取り出す際、KがNより小さい場合にheapqが優位。
- heapq vs min: 最小値を1回だけ取得する場合は**min()**が軽量で効率的。
まとめ
heapqは、優先度付きキューを実現するための強力なツールです。特に、要素を最小値から順に取り出す必要がある場合に活躍します。ただし、初期のヒープ構築には計算量がかかるため、使用するシナリオを考慮することが重要です。