python的优先权队列
python的优先权队列,根据优先权来进行队列排序, 但是注意优先权队列使用heap实现,而heap不是稳定的排序,所以,想要实现同优先权内部也有序,则需要增加一个计数,表示该优先权的顺序。参考以下代码:
#!/usr/bin/python
from Queue import Queue
from Queue import PriorityQueue
a1='a1'
a2='a2'
a3='a3'
a4='a4'
a5='a5'
b1='b1'
b2='b2'
b3='b3'
b4='b4'
b5='b5'
q = Queue()
pq = PriorityQueue()
for i in xrange(5):
p = 5 - i
q.put("a"+str(p))
q.put("b"+str(p))
pq.put((p,"a"+str(p)))
pq.put((p,"b"+str(p)))
for i in xrange(5):
p = 5 - i
q.put("a"+str(p)+str(i+5))
q.put("b"+str(p)+str(i+5))
pq.put((p,"a"+str(p)+str(i+5)))
pq.put((p,"b"+str(p)+str(i+5)))
size = q.qsize()
print "queue item size:%s" %size
print "queue items:"
for i in xrange(size):
print q.get()
size = pq.qsize()
print "priority queue item size:%s" %size
print "priority queue items:"
for i in xrange(size):
print pq.get()
#"but priority queue with same priority is not queue, if we want so, do the following:"
import itertools
count = itertools.count()
poq = PriorityQueue()
for i in xrange(5):
p = 5 - i
poq.put((p,count.next(),"a"+str(p)))
poq.put((p,count.next(),"b"+str(p)))
for i in xrange(5):
p = 5 - i
poq.put((p,count.next(),"a"+str(p)+str(i+5)))
poq.put((p,count.next(),"b"+str(p)+str(i+5)))
size = poq.qsize()
print "priority ordered queue item size:%s" %size
print "priority ordered queue items:"
for i in xrange(size):
print poq.get()
输入类似如下:
queue item size:20 queue items: a5 b5 a4 b4 a3 b3 a2 b2 a1 b1 a55 b55 a46 b46 a37 b37 a28 b28 a19 b19 priority queue item size:20 priority queue items: (1, 'a1') (1, 'a19') (1, 'b1') (1, 'b19') (2, 'a2') (2, 'a28') (2, 'b2') (2, 'b28') (3, 'a3') (3, 'a37') (3, 'b3') (3, 'b37') (4, 'a4') (4, 'a46') (4, 'b4') (4, 'b46') (5, 'a5') (5, 'a55') (5, 'b5') (5, 'b55') priority ordered queue item size:20 priority ordered queue items: (1, 8, 'a1') (1, 9, 'b1') (1, 18, 'a19') (1, 19, 'b19') (2, 6, 'a2') (2, 7, 'b2') (2, 16, 'a28') (2, 17, 'b28') (3, 4, 'a3') (3, 5, 'b3') (3, 14, 'a37') (3, 15, 'b37') (4, 2, 'a4') (4, 3, 'b4') (4, 12, 'a46') (4, 13, 'b46') (5, 0, 'a5') (5, 1, 'b5') (5, 10, 'a55') (5, 11, 'b55')
更详细资料,参考: http://hg.python.org/cpython/file/2.7/Lib/Queue.py http://docs.python.org/library/heapq.html?highlight=heapq#heapq