コンテンツにスキップ

heap

pythonではheapqクラスのメソッドにlist型のデータを渡して、直接編集する

1. basic

python ソースコード
import heapq

l = [3,10,5, 9, 1, 2]
print(l)

# heapで並べ替える
heapq.heapify(l)

print(l)
python 出力結果
[3, 10, 5, 9, 1, 2]
[1, 3, 2, 9, 10, 5] heapなので先頭以外は保証されない
 ^

2. heappush

python ソースコード
import heapq

l = [3, 10, 5, 9, 1, 2]
print(l)

# heapで並べ替える
heapq.heapify(l)

print(l)

# heapで追加する
heapq.heappush(l, 0)
print(l)

# heapで追加する
heapq.heappush(l, 4)
print(l)
python 出力結果
[3, 10, 5, 9, 1, 2]
[1, 3, 2, 9, 10, 5] heapなので先頭以外は保証されない
[0, 3, 1, 9, 10, 5, 2] heapなので先頭以外は保証されない
 ^
[0, 3, 1, 4, 10, 5, 2, 9] heapなので先頭以外は保証されない
          ^

3. heappop

  • 先頭を取り出す
python ソースコード
import heapq

l = [3,10,5, 9, 1, 2]
print(l)

# heapで並べ替える
heapq.heapify(l)

print(l)

# heapで先頭を取得する
print(heapq.heappop(l))
print(l)

# heapで先頭を取得する
print(heapq.heappop(l))
print(l)
python 出力結果
[3, 10, 5, 9, 1, 2]
[1, 3, 2, 9, 10, 5] heapなので先頭以外は保証されない
1
[2, 3, 5, 9, 10]    heapなので先頭以外は保証されない
2
[3, 9, 5, 10]       heapなので先頭以外は保証されない

4. ksmallest

  • 指定された最小値を取り出す
  • ksmallest(取得数, heapリスト)で指定する
  • k + smallの最上級で覚える
  • 第一引数に取得数を指定することに注意
python ソースコード
import heapq

l = [3,10,5, 9, 1, 2]
print(l)

# heapで並べ替える
heapq.heapify(l)

print(l)

# 最小値3つを取り出す
print(heapq.nsmallest(3,l))
print(l)
python 出力結果
[3, 10, 5, 9, 1, 2]
[1, 3, 2, 9, 10, 5]
[1 2, 3]             最小値3つを取得
[1, 3, 2, 9, 10, 5] ksmallestでは元のheapリストは変更されない

5. klargest

  • 指定された最小値を取り出す
  • klargest(取得数, heapリスト)で指定する
  • k + largeの最上級で覚える
  • 第一引数に取得数を指定することに注意
python ソースコード
import heapq

l = [3,10,5, 9, 1, 2]
print(l)

# heapで並べ替える
heapq.heapify(l)

print(l)

# 最大値4つを取り出す
print(heapq.nlargest(4,l))
print(l)
python 出力結果
[3, 10, 5, 9, 1, 2]
[1, 3, 2, 9, 10, 5]
[10, 9, 5, 3]        最大値4つ
[1, 3, 2, 9, 10, 5] klargestでは元のheapリストは変更されない

6. 発展編

6.1. 2次元リストを渡した場合

  • 第一引数でソートされる
python ソースコード
import heapq
l = []

heapq.heappush(l, [3, 3])
print(l)
heapq.heappush(l, [0, 2])
print(l)
heapq.heappush(l, [5, 1])
print(l)
heapq.heappush(l, [1, 0])
print(l)

print(heapq.nsmallest(3, l))
python 出力結果
[[3, 3]]
[[0, 2], [3, 3]]
[[0, 2], [3, 3], [5, 1]]
[[0, 2], [1, 0], [5, 1], [3, 3]]

[[0, 2], [1, 0], [3, 3]]