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

时间:2015-01-19 01:58:50

标签: python heap

python是否在2.7.3中有内置的最小堆数据结构?

我不想导入代码。

我想要像

这样的东西
myheap = minheap(key=lambda x: x[1])
myheap.add(obj)
o = myheap.pop()

这可能吗?

2 个答案:

答案 0 :(得分:7)

就像每个人都说的那样,heapq就是这样 - 但是,正如没人提到的那样,并不支持key=!所以你需要回到key=内部使用的好的旧DSU(decorate-sort-undecorate)习语,不管是heapq还是nlargest,除了函数{{ 1}}和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)

有关pushpopreplace(以及标准库模块heapq提供的其他辅助功能)之间的区别,请参阅https://docs.python.org/2/library/heapq.html

答案 1 :(得分:1)

Python附带heapq,您不必下载,但仍需要导入

Python几乎没有使用数据结构的方法,您可以在不使用import语句的情况下使用它。您是否真的希望您的语言将其整个标准库加载到每个项目的内存和命名空间中?