下面的代码构建最小堆有什么问题冒泡法不起作用,它得到一个索引超出范围的错误。
def __init__(self):
self.heap = []
self.heap_size = 0
def bubble_up(self, i):
print(self.heap)
while i // 2 > 0:
if self.heap[i] < self.heap[i // 2]:
tmp = self.heap[i // 2 - 1]
self.heap[i] = self.heap[i // 2]
self.heap[i // 2] = tmp
print(self.heap)
i = i // 2
def insert(self, data):
self.heap.append(data)
self.heap_size = self.heap_size + 1
self.bubble_up(self.heap_size)
if __name__ == "__main__":
min_heap = MinHeap()
min_heap.insert(5)
min_heap.insert(4)
min_heap.insert(3)
min_heap.insert(2)
min_heap.insert(6)
最佳答案
def insert(self, data):
self.heap.append(data)
self.heap_size = self.heap_size + 1
self.bubble_up(self.heap_size)
附加数据,增加
heap_size
,然后用新的(增加的)堆大小调用bubble_up
。在那里,你检查:
if self.heap[i] < self.heap[i // 2]:
其中
i
是堆大小。如果堆中有3
元素,则无法访问heap[3]
。它不存在,你唯一的有效索引是0, 1, 2
。可能的修复(未测试):用
bubble_up
调用heap_size - 1
。注意
if
中的代码看起来并不正确:tmp = self.heap[i // 2 - 1] # why -1 here? shouldn't this be heap[i]?
self.heap[i] = self.heap[i // 2] # shouldn't this be the other way around? why no -1 here?
self.heap[i // 2] = tmp # why no -1 here? shouldn't this be heap[i]?
另外,如果条件为false,则可以将
i // 2
放入该条件中并中断循环。关于python - 构建最小堆的Python实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29755845/