我的插入方法不正确,我不知道为什么。 我的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
答案 0 :(得分:0)
self.array.index(value)
中的insert
行很危险。如果插入已存在于堆中的值,会发生什么?您应该使用len(self.array)
代替(您将附加到数组,因此它将是最后一个元素)。
同样,在min
中,您的效果也是如此。你不需要搜索那个索引,你已经知道了。
您可能实际上想要维护自己的“长度”和“容量”属性,因为支持数组的增长和缩小将会占用预期的日志(n)。