Pythonのヒープキューアルゴリズム(heapqモジュール)徹底解説
ヒープデータ構造は、優先度付きキュー(プライオリティキュー)を実装するために利用できます。Pythonでは標準ライブラリの heapq モジュールとして提供されており、このモジュールは最小ヒープ(min-heap)を構築します。つまり、値が小さいほど優先度が高いとみなされ、新しい要素を挿入するたびに、ヒープ構造が自動的に再構成されます。
heapqモジュールを使用するには、まずインポートします。
import heapq
heapqモジュールには、以下のようなヒープ操作用のメソッドが用意されています。
heapq.heapify(iterable)
イテラブルなデータセットをヒープ構造に変換します。リストをその場で(in-placeで)ヒープ化します。
heapq.heappush(heap, element)
指定した要素をヒープに挿入し、挿入後にヒープ全体の構造を維持するよう再構成します。
heapq.heappop(heap)
ヒープの先頭(最小値)にある要素を返すと同時に削除し、残りの要素に対して再度ヒープ化を行います。
heapq.heappushpop(heap, element)
要素の挿入と取り出しを1つの処理で実行します。まず要素をプッシュし、その後ヒープの最小要素をポップします。
heapq.heapreplace(heap, element)
こちらも挿入と取り出しを1つの処理で行います。ただし heappushpop とは動作順序が異なり、まずルート(最小要素)を削除してから、新しい要素をヒープに挿入します。
heapq.nlargest(n, iterable, key=None)
データセットから最大の n 個の要素を、大きい順(降順)のリストとして返します。
heapq.nsmallest(n, iterable, key=None)
データセットから最小の n 個の要素を、小さい順(昇順)のリストとして返します。
サンプルコード
import heapq
my_list = [58, 41, 12, 17, 89, 65, 23, 20, 10, 16, 17, 19]
heapq.heapify(my_list)
print(my_list)
heapq.heappush(my_list, 7)
print(my_list)
print('Popped Element: ' + str(heapq.heappop(my_list)))
print(my_list)
new_iter = list()
new_iter = heapq.nlargest(4, my_list)
print(new_iter)
実行結果
[10, 16, 12, 17, 17, 19, 23, 20, 41, 89, 58, 65] [7, 16, 10, 17, 17, 12, 23, 20, 41, 89, 58, 65, 19] Popped Element: 7 [10, 16, 12, 17, 17, 19, 23, 20, 41, 89, 58, 65] [89, 65, 58, 41]
この例では、まず heapify() でリストをヒープ化し、続いて heappush() で値 7 を挿入しています。その後 heappop() を呼び出すと、ヒープの先頭にある最小値 7 が取り出されます。最後に nlargest(4, ...) を使うことで、リスト内の大きい方から4つの要素が降順で取得できていることが確認できます。このように heapq を使えば、優先度付きキューや「上位N件の抽出」などを効率的に実装できます。
-
PythonでMean-Shift(平均シフト)アルゴリズムを実装する方法
機械学習にはさまざまな種類のクラスタリングアルゴリズムが存在し、その多くはPythonで実装できます。本記事では、教師なし学習手法として用いられるクラスタリングアルゴリズムの一つである「Mean-Shift(平均シフト)」について、その仕組みとPythonによる実装方法を解説します。 Mean-Shiftアルゴリズムとは Mean-Shiftアルゴリズムは、データ分布に関する事前の仮定を必要としないノンパラメトリックな手法です。このアルゴリズムでは、各データポイントを反復的に移動させながら、データポイントが最も密集している領域(高密度領域)へとシフトさせることで、クラスタへの割り当てを行いま
-
Pythonでヒープソートを実装する方法をわかりやすく解説
この記事では、配列をヒープソート(Heap Sort)のアルゴリズムを使って並べ替えるPythonプログラムについて解説します。 問題の概要 問題文: 与えられた配列を、ヒープソートの考え方を用いて昇順にソートします。 ヒープソートでは、まず配列を最大ヒープ(親ノードが常に子ノード以上の値を持つ二分木構造)に構築します。その後、最大値であるルート要素を配列の末尾と交換し、残りの部分に対して再度ヒープ化を行うという操作を繰り返します。これにより、大きな値から順に後ろへ確定していき、最終的に配列全体がソートされます。 それでは、実際の実装例を見ていきましょう。 実装例 # ヒープ化処理 def h