util.py
import heapq
class PriorityQueue:
def __init__(self):
self.heap=[]
def push(self,item,priority):
pair = (priority,item)
heapq.heappush(self.heap,pair)
def pop(self):
(priority,item) = heapq.heappop(self.heap)
return item
def getHeap(self):
return self.heap
Class PriorityQueueWithFunction(PriorityQueue):
def __init__ (self,priorityFunction):
self.priorityFunction = priorityFunction
PriorityQueue.__init__(self)
def push(self,item):
PriorityQueue.push(self, item, self.priorityFunction(item))
pqtest.py
import os,sys
lib_path = os.path.abspath('../../lib/here')
sys.path.append(lib_path)
import Util
import string
import random
def str_gen():
return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(random.randint(2,8)))
def pqfunc(item):
return len(str(item))
rdy = Util.PriorityQueueFunction(pqfunc)
for i in range(1,10):
rdy.push(str_gen())
for i in rdy.getHeap():
print i
打印
(3, '2UA')
(4, '6FD6')
(6, 'DLB66A') <---out of place
(4, 'J97K')
(7, 'GFQMRZZ') <----out of place
(6, 'SRU5T4')
(7, 'BP4PGKH')
(7, 'CBUJWQO')
(7, '5KNNY1P')
为什么这两个不合适以及如何解决?
当我在rdy.pop()
内添加打印for i in rdy.getHeap():
时
当我推进9时,它只会弹出其中的5个
答案 0 :(得分:6)
heapq
函数不会使列表排序,但仅保证堆属性得以维护:
heap[k] <= heap[2*k+1]
heap[k] <= heap[2*k+2]
因此,heap[0]
始终是最小的项目。
如果要按优先级顺序迭代项目,则不能简单地遍历堆,但需要关闭pop()
项,直到队列为空。 heappop()
将获取第一个项目,然后重新组织列表以实现堆不变量。
答案 1 :(得分:1)
如果你想要一个列表,你可以使用heapq的最小和最大的函数。
heapq.nsmallest(len(my_heap),my_heap) - 列出最小到最大
heapq.nlargest(len(my_heap),my_heap) - 列出最大到最小