我必须简单地提出一个不在代码中的算法,而是用单词来表示最小二进制堆中的最大值。我认为,因为最小二进制堆包含底部的最高值,如果您在索引的末尾而不是开始处开始搜索,您将立即找到它而不是从头开始搜索。这在实践和理论中是否有意义?谢谢!
答案 0 :(得分:1)
以下是最小二进制堆:
1
2 5
3 4
只是指出尽管最大值保证是叶子,但并非所有叶子都必须位于树的最低层。
答案 1 :(得分:0)
二进制堆包含〜n/2
个叶子,其中n
是堆中元素的总数,实际上其中一个将是最大值。
但是,您必须遍历所有这些以找到最大值,因此您收到的加速比仅为* 2,并且使用此方法仍为O(n)
。
答案 2 :(得分:0)
以下是min-binary-heap:
1
2 3
10 5 20 7
“最大”可以在树叶中任何地方。
如果你在索引的末尾开始搜索而不是 一开始,你会马上找到它,而不是从中搜索 开始。
这是不正确的。
可以跳过非叶子,但这对渐近复杂性没有帮助,因为具有n
元素的堆具有大约n/2
个叶子。简单的线性扫描就好了。
答案 3 :(得分:0)
二进制堆的结构是一个平衡树。在内部,它可以表示为节点树或数组。
如果它被表示为树,你别无选择,只能将所有节点遍历到叶子,这是一个O(n)解决方案,除非你引用了叶子。
如果它表示为数组,则可以做得更好。注意,元素k的2个子元素分别为2k和2k + 1。这意味着您可以查看数组的末尾并向后走。这会更快,但仍然是O(n)
答案 4 :(得分:0)
如果堆的大小为n,则需要从索引n-1搜索到(n-1)/ 2。这些数字中最高的将给你最大数字。
明智的话,你必须搜索所有LEAF NODES以找出最高的数字。这是O(n / 2)或O(n)操作。