python中的最小堆

python中的最小堆,python,object,heap,min-heap,Python,Object,Heap,Min Heap,我想通过定义一个自定义比较函数将一组对象存储在最小堆中。我看到有一个heapq模块作为python发行版的一部分提供。有没有办法将自定义比较器用于此模块?如果没有,是否有其他人构建了自定义最小堆?是的,有一种方法。定义一个实现自定义比较器的包装类,并使用这些类的列表而不是实际对象的列表。这是在仍然使用heapq模块的情况下最好的,因为它不像排序函数/方法那样提供key=或cmp=参数 def gen_wrapper(cmp): class Wrapper(object):

我想通过定义一个自定义比较函数将一组对象存储在最小堆中。我看到有一个heapq模块作为python发行版的一部分提供。有没有办法将自定义比较器用于此模块?如果没有,是否有其他人构建了自定义最小堆?

是的,有一种方法。定义一个实现自定义比较器的包装类,并使用这些类的列表而不是实际对象的列表。这是在仍然使用heapq模块的情况下最好的,因为它不像排序函数/方法那样提供key=或cmp=参数

def gen_wrapper(cmp):
    class Wrapper(object):
        def __init__(self, value): self.value = value
        def __cmp__(self, obj): return cmp(self.value, obj.value)
    return Wrapper
两种选择(除Devin Jeanpierre的建议外):

  • 在使用堆之前修饰数据。这相当于排序的
    键=
    选项。e、 g.如果您(出于某种原因)希望根据数字的正弦数来排列数字列表:

    data = [ # list of numbers ]
    heap = [(math.sin(x), x) for x in data]
    heapq.heapify(heap)
    # get the min element
    item = heappop(heap)[1]
    
  • heapq
    模块是用纯python实现的。您只需将其复制到工作目录并更改相关位即可。快速查看,您必须修改siftdown()和siftup(),如果需要,还可能修改nlagest和nsmallest


  • 请注意,这在Python3.0中不起作用,因为Python3.0去掉了cmp。不,它在Python3.0中不起作用,但这并不重要,因为Python3.0缺少“comparator function”的整个概念。这个问题根本不适用于那种情况。您应该定义le而不是cmp。这将保持Python 2/3的兼容性。毕竟,heapq操作和排序操作使用的是我并不关心python 3.0的兼容性。Python3.0仍然没有被广泛使用,编写2/3的QUINE是困难的,最终也是徒劳的。在2.x中定义这一点最具Python风格的方法是我在上面写的。Python3.0是向后不兼容的,2.x中最好的可能不起作用。太糟糕了。另外,heapq模块是用C和Python实现的。导入heapq使用C模块(如果可用)。啊,你说得对。好的,我第二个建议的重要一点是,如果您想自己使用python代码,那么可以在您的lib目录中使用python代码。我认为这是更好的解决方案。它实际上需要更少的代码,而且可能更快,因为您使用的是内置元组类型,而不是定义自己的类