我正在学习堆数据结构,并发现了这个链接
我希望heapq.heapify([5, 7, 9, 1, 3])
的输出是
[1, 3, 9, 5, 7]
然而,我看到它返回这个:
[1, 3, 9, 7, 5]
正如一些人所说,同一级别上的顺序无关紧要,那么我想我只是感到困惑,因为同一级别的顺序无关紧要。原始序列中的[5,7]
是如何交换位置的。
有人能解释一下为什么会是这样吗?
57913 # Starting list
在";堆化";过程(对于min-堆(:
正如本视频中所解释的,我们从右边一个接一个地迭代列表中的元素,每次迭代都会检查其下方的堆是否为有效堆。如果不是,我们交换这个子堆的元素,直到它变为有效。
5
7 9
1 3
3:下面没有元素-->这是一个有效的堆
1:在它下面没有元素-->这是一个有效的堆
9:下面没有元素-->这是一个有效的堆
7 > min(1, 3)
,
1<3->所以选择1
与7 交换
5
1 9
7 3
5 > min(1, 9)
,
1<9->所以选择1
与5:交换
1
5 9
7 3
5 > min(3, 7)
,
3<7->所以选择3
与5 交换
1
3 9
7 5
13975 # Result
请注意,堆数据结构只保证顶部是最小值[或最大值]。它一点也不像二进制搜索树,我认为这正是您对订单的期望。
二进制搜索树的不变量是,对于每个节点x
,左子树中的所有关键字都应该小于x
,右子树中的全部关键字都应该大于x
。
然而,在堆中,不变量只是每个节点x
都应该大于[或小于]其子节点。请注意,它没有指定任何关于其左子树或右子树的内容。
序列[1, 3, 9, 7, 5]
是一个有效的堆。注意每个父母都比孩子小。
1
3 9
7 5