python 在 2.7.3 中是否有内置的最小堆数据结构?
我不想导入代码。
我想要类似的东西
myheap = minheap(key=lambda x: x[1])
myheap.add(obj)
o = myheap.pop()
这可能吗?
请您参考如下方法:
正如每个人所说,heapq 就是它——但是,正如还没有人提到的那样,它不支持 key=!因此,您需要回退到 key= 在任何受支持的地方都在内部使用的好旧 DSU(装饰-排序-取消装饰)习惯用法(可惜 heapq 中没有,除了函数 nlargest 和 nsmallest 实际上与模块的其余部分没有太大关系)。
因此您可以包装 heapq 功能,添加一个键,例如在您自己的类中:
import heapq
class MyHeap(object):
def __init__(self, key, data=())
self.key = key
self.heap = [(self.key(d), d) for d in data]
heapq.heapify(self.heap)
def push(self, item):
decorated = self.key(item), item
heapq.heappush(self.heap, decorated)
def pop(self):
decorated = heapq.heappop(self.heap)
return decorated[1]
def pushpop(self, item):
decorated = self.key(item), item
dd = heapq.heappushpop(self.heap, decorated)
return dd[1]
def replace(self, item):
decorated = self.key(item), item
dd = heapq.heapreplace(self.heap, decorated)
return dd[1]
def __len__(self):
return len(self.heap)
参见 https://docs.python.org/2/library/heapq.html pushpop 和 replace 的区别(以及标准库模块 heapq 提供的其他辅助函数)。
