min-heap与自定义数据类型Python?

时间:2013-06-21 13:06:14

标签: python image image-processing data-structures

我想在Python中实现快速行进方法以进行修复。在文献中,这是使用min-heap实现的。因为它涉及多次添加,删除和重新排序数据结构,并且每次都提取最小的元素。因此,这些操作的复杂性最好是最小的。

我知道Python中有一个heapq内置模块。它接受单个float值。但是,我需要存储与像素对应的3个不同的信息内容。有没有办法可以调整heapq来接受列表?

或者,是否存在具有此功能的不同数据结构?

1 个答案:

答案 0 :(得分:2)

heapq使用任何类型,只要它们是可订购的。这些项目必须支持<低于或<=低于或等于运算符(heapq将使用后者,如果第一个不可用)。

例如,您可以使用元组((priority, your_data_structure));元组具有基于其内容的相对顺序,从第一项开始。

或者您可以使用至少实现__lt____le____gt____ge__之一的自定义对象来实现它们之间的比较,从而定义排序(和,最好也包括__eq__等式方法。 functools. total_ordering() decorator然后会为您的班级提供其余方法:

from functools import total_ordering

@total_ordering
class PixelInfo(object):
    def __init__(self, r, g, b):
        self.r, self.g, self.b = r, g, b

    def __eq__(self, other):
        if not isinstance(other, type(self)): return NotImplemented
        return all(getattr(self, c) == getattr(other, c) for c in 'rgb')

    def __lt__(self, other):
        if not isinstance(other, type(self)): return NotImplemented
        return self.r + self.g + self.b < other.r + other.g + other.b

将是一个可订购的自定义类,heapq很乐意为您处理。