我需要用文字而非代码的方式简单地呈现一种算法,以查找最小二叉堆中的最大值。我的论点是,因为最小二叉堆在底部包含最高的值,所以如果你从索引的末尾开始搜索而不是从开头开始,你会立即找到它,而不是从开头搜索。这在实践和理论上都有意义吗?谢谢!
1
2 5
3 4
仅仅是指出尽管最大值保证是一个叶子节点,但并不是所有的叶子节点都必须在树的最低层。
以下是一个最小二叉堆:
1
2 3
10 5 20 7
“最大值”可以在叶子节点的任何位置。
如果您从索引末尾开始搜索,而不是从开头开始搜索,则会立即找到它,而不是从开头搜索。
那是不正确的。
跳过非叶子节点是可能的,但这并没有真正帮助渐进复杂度,因为具有n
个元素的堆,大约有n/2
个叶子节点。简单的线性扫描就可以了。
n/2
个叶子节点,其中 n
是堆中元素的总数,而且其中一个将是最大值。O(n)
。二叉堆的结构是一棵平衡树。在内部,它可以被表示为节点树或数组。
如果它被表示为树,你只能遍历所有节点到叶子节点,这是一个O(n)的解决方案,除非你有对叶子节点的引用。
如果它被表示为数组,你可以做得更好。注意元素k的2个子节点分别在2k和2k+1处。这意味着你可以查看数组的末尾并向后遍历。这将更快,但仍然是O(n)。
如果堆的大小为n,则需要从索引n-1到(n-1)/2进行搜索。这些数字中最高的将给出最大值。
逐个搜索所有叶节点以找出最高数字。这是一个O(n/2)或O(n)操作。
n-1
到(n-1)/2
。给定大小为n
的基于数组的堆,如果2*p+1 >= n
,则索引为p
的节点是叶节点。解出p
得到p = (n-1)/2
。 - user3386109