前言
python默认的 pq 是小顶堆实现,非常不灵活,所以我就摸索出来了一种比较灵活的使用方法
用 PriorityQueue 实现大顶堆
from queue import PriorityQueue
pq = PriorityQueue()
pq.put((-1, 1) )
pq.put((-2, 2) )
pq.put((-3, 3) )
while not pq.empty():
print(pq.get() )
以上代码把一个元组 (-x, x) put 进了堆,但是python只会比较元组的第一个元素,即 -x,所以元组的第二位可以用来保存自己的信息
以上代码输出:
(-3, 3)
(-2, 2)
(-1, 1)
我们不需要关注返回来的元组的第一位是什么,因为它仅仅是用来比较的,我们需要关注的是元组的第二位,这才是我们需要的数据
用 pq 实现类似C++比较函数的功能
下面我们用这一特性实现比较复杂的类似比较函数的功能
from queue import PriorityQueue
pq = PriorityQueue()
s1, s2, s3, s4 = 'dfs', 'dijkstra', 'iddfs', 'spfa'
pq.put((len(s1), s1) )
pq.put((len(s2), s2) )
pq.put((len(s3), s3) )
pq.put((len(s4), s4) )
while not pq.empty():
print(pq.get() )
该程序相当于把 len(s) 当作了比较函数参与比较,不做过多解释,运行结果如下
(3, 'dfs')
(4, 'spfa')
(5, 'iddfs')
(8, 'dijkstra')
容易看出,相当于按照 “字符串字节数小的优先级高” 这一规则进行的堆化
最后总结一下:
人生苦短,我用Python!!!
以后还会不定期分享一些小经验
就酱紫~