为什么堆中的数据序列与我想象的不一样



我正在学习堆数据结构,并发现了这个链接

我希望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

最新更新