優先順位付キューを使おう
前回は先入れ先出し(FIFO)キューと後入れ先出し(LIFO)キューを使ったプログラムを作りました。
今回は優先順位付キューを使ったプログラムを作ってみましょう。
優先順位付キューとは何か?
優先順位付キューは、キューに入れた順番に関係なく、最小の値を持つ要素が最初に検索されます。
キューに入れる基本的な要素のパターンは、(優先順位番号, 値) という形式のタプルになります。
例えば、(2, "山")、(0, "海")、(1, "川") という順番で優先順位付キューに要素を入れると、取り出す時は (0, "海")、(1, "川")、(2, "山") という順番になります。
優先順位付キューオブジェクトを作成する
優先順位付キューオブジェクトの作成は、以下のようになります。
オブジェクト名.PriorityQueue(maxsize=0)
maxsizeオプションはキューに入れる要素数を表す整数です。
デフォルトは0で、無限に要素を入れることができます。
キューに対する要素の出し入れは、先入れ先出しキューや後入れ先入れキューと同じなので、前回の記事を参照してください。
優先順位付キューを使ったプログラム
優先順位付キューを使ったプログラムは、以下のようになります。
キューにタプルの要素を入れて、取り出す時は優先順位と値を別々にして、それぞれをキャンバスに表示させています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
### インポート import time import tkinter import threading import queue ### 関数 def func(): ### キュー空ではない間ループ while not queue.empty(): ### キャンバス書き込み num,val = queue.get() id1 = canvas.create_text(100, 100, text=num, font=(None,48)) id2 = canvas.create_text(180, 100, text=val, font=(None,48), anchor="w") ### 待ち時間 time.sleep(1) ### キャンバス初期化 canvas.delete(id1) canvas.delete(id2) ### キャンバス作成 canvas = tkinter.Canvas(master=None, width=420, height=200) ### キャンバス表示 canvas.pack() ### キュー作成 queue = queue.PriorityQueue() ### プライオリティ値とデータを持つタプルを順不同に並べる for tuple in [(4,"horse"),(7,"panther"),(9,"cow"),(3,"bear"),(1,"cat"),(8,"pig"),(0,"dog"),(6,"tiger"),(5,"lion"),(2,"mouse")]: ### キューに値を設定 queue.put(tuple) ### スレッド作成 thread = threading.Thread(target=func, daemon=True) ### スレッド開始 thread.start() ### イベントループ canvas.mainloop() |
プログラムを実行すると、左側に優先順位番号、右側にその値が表示されます。