如何将新值插入最大堆并将 max_delete 应用于堆
how to insert new value into max heap and apply max_delete to heap
问题 1
98
/ \
/ \
67 89
/ \ / \
/ \ / \
38 42 54 89
/ \
/ \
17 25
我想将 97 插入最大堆 [98,67,89,38,42,54,89,17,25](在列表中表示)。
按照我的说法,结果堆是 [98,97,89,38,67,54,89,17,25,42]
98
/ \
/ \
97 89
/ \ / \
/ \ / \
38 67 54 89
/ \ |
/ \ |
17 25 42
问题 2
我想对堆 [100,97,93,38,67,54,93,17,25,42] 应用 delete_max() 两次。
100
/ \
/ \
97 93
/ \ / \
/ \ / \
38 67 54 93
/ \ |
/ \ |
17 25 42
根据两次 deletemax 操作后的堆,结果堆为 [93,67,93,38,42,54,25,17]
93
/ \
/ \
67 93
/ \ / \
/ \ / \
38 42 54 25
/
/
17
我想符合,我是否正在做插入并且 max_delete 正确地用于堆和上面的答案是正确的?
如果不正确,请指导我。
寻找这个 link 这样你就可以通过这个 link
访问
https://cstechwiki.blogspot.in/2016/09/python-week-6-quiz-assignment-nptel.html
您的回答看起来是正确的。让我们仔细看看为什么。
在第一种情况下,您有堆:
[98,67,89,38,42,54,89,17,25]
你想插入97,所以你把它加到最后,然后冒泡起来:
[98,67,89,38,42,54,89,17,25,97]
您将 97 与其 parent (42) 进行比较。因为 97 更大,所以你交换它们:
[98,67,89,38,97,54,89,17,25,42]
然后再次将 97 与其 parent 进行比较。这次 parent 是 67,所以你必须再次交换。
[98,97,89,38,67,54,89,17,25,42]
再比较一次,您发现 parent (98) 大于您插入的项目,所以您完成了。
现在,给定堆 [100,97,93,38,67,54,93,17,25,42]
,您想要删除最高的两个项目。 delete_max 的规则是用堆上的最后一项替换根,然后筛选它。所以你有:
[42,97,93,38,67,54,93,17,25]
42 比它的 children 小,所以你把它换成最大的 child:
[97,42,93,38,67,54,93,17,25]
大于38,小于67,你再换:
[97,67,93,38,42,54,93,17,25]
而 42 现在处于叶级别,因此无需再做任何事情。这是删除的第一项。现在删除第二个。将 25 移动到根:
[25,67,93,38,42,54,93,17]
并筛选:
[93,67,25,38,42,54,93,17] // swapped with 93
[93,67,93,38,42,54,25,17] // swapped with 93 again
问题 1
98
/ \
/ \
67 89
/ \ / \
/ \ / \
38 42 54 89
/ \
/ \
17 25
我想将 97 插入最大堆 [98,67,89,38,42,54,89,17,25](在列表中表示)。
按照我的说法,结果堆是 [98,97,89,38,67,54,89,17,25,42]
98
/ \
/ \
97 89
/ \ / \
/ \ / \
38 67 54 89
/ \ |
/ \ |
17 25 42
问题 2
我想对堆 [100,97,93,38,67,54,93,17,25,42] 应用 delete_max() 两次。
100
/ \
/ \
97 93
/ \ / \
/ \ / \
38 67 54 93
/ \ |
/ \ |
17 25 42
根据两次 deletemax 操作后的堆,结果堆为 [93,67,93,38,42,54,25,17]
93
/ \
/ \
67 93
/ \ / \
/ \ / \
38 42 54 25
/
/
17
我想符合,我是否正在做插入并且 max_delete 正确地用于堆和上面的答案是正确的? 如果不正确,请指导我。
寻找这个 link 这样你就可以通过这个 link
访问https://cstechwiki.blogspot.in/2016/09/python-week-6-quiz-assignment-nptel.html
您的回答看起来是正确的。让我们仔细看看为什么。
在第一种情况下,您有堆:
[98,67,89,38,42,54,89,17,25]
你想插入97,所以你把它加到最后,然后冒泡起来:
[98,67,89,38,42,54,89,17,25,97]
您将 97 与其 parent (42) 进行比较。因为 97 更大,所以你交换它们:
[98,67,89,38,97,54,89,17,25,42]
然后再次将 97 与其 parent 进行比较。这次 parent 是 67,所以你必须再次交换。
[98,97,89,38,67,54,89,17,25,42]
再比较一次,您发现 parent (98) 大于您插入的项目,所以您完成了。
现在,给定堆 [100,97,93,38,67,54,93,17,25,42]
,您想要删除最高的两个项目。 delete_max 的规则是用堆上的最后一项替换根,然后筛选它。所以你有:
[42,97,93,38,67,54,93,17,25]
42 比它的 children 小,所以你把它换成最大的 child:
[97,42,93,38,67,54,93,17,25]
大于38,小于67,你再换:
[97,67,93,38,42,54,93,17,25]
而 42 现在处于叶级别,因此无需再做任何事情。这是删除的第一项。现在删除第二个。将 25 移动到根:
[25,67,93,38,42,54,93,17]
并筛选:
[93,67,25,38,42,54,93,17] // swapped with 93
[93,67,93,38,42,54,25,17] // swapped with 93 again