如何将新添加的数字交换到二进制堆中的正确位置?

时间:2019-05-26 05:31:23

标签: python python-3.x heap min-heap

这个我的家庭作业问题已经通过了一个列表,其中索引1是新节点,也是根。然后,我必须检查它的子项是否小于其自身,然后与较小的子项交换。我已经写了一些代码,但是没有用。

def perc_down(data):
    count = 0
    index = 1
    l, r = 2 * index, 2 * index + 1
    while index < len(data):
        if data[index] > data[l] and data[index] > data[r]:
            min_i = data.index(min(data[l], data[r]))
            data[index], data[min_i] = data[min_i], data[index]
            count += 1
            index = min_i
    return count

values = [0, 100, 7, 8, 9, 22, 45, 12, 16, 27, 36]
swaps = perc_down(values)
print('Binary heap =',values)# should be [0, 7, 9, 8, 16, 22, 45, 12, 100, 27, 36]
print('Swaps =', swaps)# should be 3

1 个答案:

答案 0 :(得分:2)

在while循环内提供lr

while index <= len(data) // 2:
    l, r = 2 * index, 2 * index + 1
    if r >= len(data):
        r = index
    if data[index] > data[l] or data[index] > data[r]:
        min_i = data.index(min(data[l], data[r]))
        data[index], data[min_i] = data[min_i], data[index]
        count += 1
        index = min_i
    print(data) #Added this for easy debugging. 
return count

并运行循环直到一半的值,这仅是因为它是二进制最小堆。
输出:

[0, 7, 100, 8, 9, 22, 45, 12, 16, 27, 36]
[0, 7, 9, 8, 100, 22, 45, 12, 16, 27, 36]
[0, 7, 9, 8, 16, 22, 45, 12, 100, 27, 36]
Binary heap = [0, 7, 9, 8, 16, 22, 45, 12, 100, 27, 36]
Swaps = 3

针对那些不存在子项的索引修改了算法。
对于:values = [0, 100, 7, 11, 9, 8, 45, 12, 16, 27, 36]对于100,对于Binary heap = [0, 7, 8, 11, 9, 36, 45, 12, 16, 27, 100],在2个交换之后到达索引5,该索引没有合适的子对象,因此当它超过列表的长度时,我们只需将其设置回原始索引即可。
整理清单:in