这个堆的实现有什么问题?

时间:2016-07-08 08:30:08

标签: python heap

我的插入方法不正确,我不知道为什么。 我的min方法错误没有" builtin_function或对象不可订阅"

我认为我对堆的概念性理解是可以的。但是当它实际写下来时,它的压倒性令人沮丧:(

class Heap:
    def __init__(self):
        self.array = []

    def find_children(self, index):
        """ return both the left and right children """
        return index * 2 + 1, index * 2 + 2

    def insert(self, value):
        """ append node value to the array, then bubble up
        to its rightful place
        """
        self.array.append(value)
        index = self.array.index(value)

        while index > 0 or self.array[index] < self.array[index // 2 - 1]:
            if self.array[index] < self.array[index // 2 - 1]:
                temp = self.array[index]
                self.array[index] = self.array[index // 2 - 1]
                self.array[index // 2 - 1] = temp
            index = index // 2 - 1

    def min(self):
        """ remove the min at the root, then bubble down to
        maintain heap property
        """
        minimum = self.array[0]
        self.array[0] = self.array[-1]
        self.array.pop()

        index = self.array.index[minimum]

        while index <= len(self.array):
            leftChildIndex, rightChildIndex = self.find_children(index)
            minChild = min( self.array[leftChildIndex], self.array[rightChildIndex] )
            if self.array[index] > minChild:
                temp = self.array[index]
                self.array[index] = minChild
                minChild = temp
            index = minChild

        return minimum

    def p(self):
        return self.array

1 个答案:

答案 0 :(得分:0)

self.array.index(value)中的insert行很危险。如果插入已存在于堆中的值,会发生什么?您应该使用len(self.array)代替(您将附加到数组,因此它将是最后一个元素)。

同样,在min中,您的效果也是如此。你不需要搜索那个索引,你已经知道了。

您可能实际上想要维护自己的“长度”和“容量”属性,因为支持数组的增长和缩小将会占用预期的日志(n)。