1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonのheapqの記法を直感的に直す

Last updated at Posted at 2024-12-14

背景

 Pythonのheapqを一度でも使ったことがある競プロerなら、その直感的でない記法をなんとかしてほしいと思ったことがあるはず。わざわざ優先度付きキュー専用のリストを作り、そのキューにpushしたりキューからpopしたいときに

heappush(q, (優先度, ))

pri, val = heappop(q)

などと書くのはあまりにも直感に反する。dequeなら

q = deque()

と生成でき、appendやpopしたいときも、

q.append()

val = q.pop()

と書ける。heapqも同じように書きたいと思ったことは一度や二度ではないだろう。

neoheapq

 そこで、こう書けるように新しいクラスを作った。名付けてneoheapq

python neoheapq.py
import heapq

class neoheapq:
  def __init__(self):
    self.q = []
    
  def push(self, h:float, val:any) -> None:
    heapq.heappush(self.q, (h,val))
    
  def pop(self) -> tuple[float,any]:
    return heapq.heappop(self.q)
    
  def __getitem__(self, idx) -> tuple[float,any]:
    return self.q[idx]
    
  def __len__(self) -> int:
    return len(self.q)

概要

内部でリストを作り、heapq.heappushheapq.heappopを動かしている。それだけ。

使い方

生成

q = neoheapq()

heapifyに相当する機能は競プロにはあまり要らなさそうだったので作ってない。

追加

q.push(優先度, )

pop

pri, val = q.pop()

popを呼ぶと、もっとも優先度が小さいものの(優先度, 値)のタプルがpopされる。

最初のものを取得

pri, val = q[0]

q[0]で、qのうちもっとも優先度が小さいもののタプル(優先度, 値)が返される。heapqと同じくq[1]以降は優先度順になっておらず、あまり意味がないので注意。

値の数

len(q)

最後に

 これを使ってダイクストラ法のサンプルコードを作ろうと思ったんですが、面倒なので誰かやってください (丸投げ)

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?