LoginSignup
0
0

More than 3 years have passed since last update.

Python 優先度付きキュー 殆どの人が興味無さそうなheapify関数の結果の謎

Last updated at Posted at 2020-09-20

はじめに

Pythonで優先度付きキューの挙動で謎な部分があり調べてみた。

不可解な挙動

こちらを参考に、Pythonで優先度付きキューが調べていたところ、heapqライブラリで実現が可能とのこと。
上記リンク先にでは、heapqの使用例として以下の通り記載されていた。

#引用元:https://qiita.com/ell/items/fe52a9eb9499b7060ed6
import heapq  # heapqライブラリのimport

a = [1, 6, 8, 0, -1]
heapq.heapify(a)  # リストを優先度付きキューへ
print(a)
# 出力: [-1, 0, 8, 1, 6] (優先度付きキューとなった a)

なぜ出力がこの並び([-1, 0, 8, 1, 6] )なのか?
誰も興味無さそうな疑問が湧いてきた(昇順を期待してたので)。

理由:リストの要素をヒープキューアルゴリズムでソートしているため

Pythonでは、優先度付きキューをリストで表現している様であるが、
python documentによると、ヒープキューアルゴリズムでリストの内容を並べ替えしているとのこと。

こちらのヒープの説明サイトにて、ヒープのアルゴリズムの説明が詳しく記載されているが、
木構造をリストで表現できるとのこと(親ノードのリストインデックスをiとすると、子の左ノードが2*i、右ノードが2*i+1)。
親子関係が成立する様に、リスト内の要素を入れ替えすると、上記の出力が得られた。

ヒープキューアルゴリズムによるソートの流れ

※詳しいアルゴリズムはこちらを参照

ヒープの条件:各ノードがその子ノードより小さいか等しい
初期配列:[1, 6, 8, 0, -1]

heapq.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0