Skip to main content
 首页 » 编程设计

python之python是否有内置的最小堆数据结构

2025年05月04日11落叶无声

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 提供的其他辅助函数)。