heapq模塊是一個(gè)以堆結(jié)構(gòu)解決問題的模塊。對(duì)于需要不斷取一個(gè)列表的最值問題上,可以通過不斷排序來(lái)實(shí)現(xiàn),但是當(dāng)列表過大時(shí)排序就會(huì)很費(fèi)時(shí),為此使用堆結(jié)構(gòu)來(lái)解決這個(gè)問題更加合理。
以下 用heapq 來(lái)實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)隊(duì)列
# coding=utf8
import heapq
class ProrityQueeue(object):
def __init__(self):
self._index = 0 #用來(lái)維護(hù)優(yōu)先級(jí)一樣的item的排序
self._queuue = []
def push(self,prority,item):
# heapq.heappush 以堆結(jié)構(gòu)的方式插入,保證堆頂為最小元素
# 為了方便以優(yōu)先級(jí)比較,將每一個(gè)子項(xiàng) 設(shè)置為一個(gè)元組,優(yōu)先級(jí)相同時(shí)按照插入的順序排列
heapq.heappush(self._queuue,(-prority,self._index,item))
self._index += 1
def pop(self):
return heapq.heappop(self._queuue)[2]
if __name__ == '__main__':
pq = ProrityQueeue()
pq.push(5,'5')
pq.push(3,'4')
pq.push(6,'6')
pq.push(7,'9')
pq.push(7,'7')
pq.push(8,'8')
for i in range(6):
print pq.pop()
輸出************************
8
9
7
6
5
4