搜索最小二元堆

时间:2014-04-28 23:24:20

标签: java algorithm logic heap

我必须简单地提出一个不在代码中的算法,而是用单词来表示最小二进制堆中的最大值。我认为,因为最小二进制堆包含底部的最高值,如果您在索引的末尾而不是开始处开始搜索,您将立即找到它而不是从头开始搜索。这在实践和理论中是否有意义?谢谢!

5 个答案:

答案 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)操作。