【问题标题】:Does python have a built in min-heap data structure?python 有内置的最小堆数据结构吗?
【发布时间】:2015-03-17 00:07:02
【问题描述】:

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

我不想导入代码。

我想要类似的东西

myheap = minheap(key=lambda x: x[1])
myheap.add(obj)
o = myheap.pop()

这可能吗?

【问题讨论】:

  • 不是内置的,你必须使用import heapq
  • 查看标准库中的heapq模块...

标签: python heap


【解决方案1】:

就像大家说的那样,heapq 是吗?但是,正如还没有人提到的那样,它支持key=!因此,您需要退回到 key= 在任何受支持的地方都在内部使用的旧 DSU(装饰排序不装饰)习语(唉,heapq 中没有,除了函数 nlargestnsmallest 不支持) t 真的与模块的其余部分有很大关系)。

因此您可以包装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,了解pushpopreplace(以及标准库模块heapq 提供的其他辅助功能)之间的区别。

【讨论】:

  • 在 heapq 中,如果要放入对象,如何使用 lambda 来指定其键?像 heapq.heappush(Q, v, key=lambda x: f(x))
  • 直接在heapq 中,您不需要,正如我在回答开头所解释的那样!在上面的MyHeap 类中,您实例化h=MyHeap(func),然后自动使用特征提取函数。如果你想使用 funclambda,这是 Python 最差的一个特性,而不是干净而快速的 operator.itemgetter(1)(当然需要 import operator),唉,我不能阻止你(因为 Guido ,一反常态,他放弃了最初的设计决定,以消除 Python 3 中的 lambda,至少从 Python 4 开始,我们就一直坚持下去:-)。
  • @AlexMartelli docs.python.org/2/library/heapq.html#basic-examples 中的第二个示例说明了如何将元组与 heapq 一起使用,假设第一个元素是键。
  • @ziddarth,当然,如果优先级不是排队内容的函数,那么 key= 等效项将无济于事,手动使用 (key, content) 元组几乎是唯一的方法走。但是,这与该线程上的原始问题无关。
【解决方案2】:

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

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

【讨论】:

  • 在 heapq 中,如果要放入对象,如何使用 lambda 来指定其键?像 heapq.heappush(Q, v, key=lambda x: f(x))
  • @omega,你不能,正如我在回答中所说:heapq 不支持key=(除了一些不影响你的 Q 的辅助功能)。
猜你喜欢
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2021-08-17
  • 2013-06-05
  • 2015-11-15
相关资源
最近更新 更多