二进制堆:根据位置i的子树的高度

时间:2014-08-20 07:10:16

标签: algorithm heap binary-heap

给定n个值,我创建了一个Binary Max-Heap。我想知道计算任意位置的子树高度的公式i。

3 个答案:

答案 0 :(得分:0)

完整二进制堆中的每个级别都有2 ^ i个节点,因此除了最后一级之外,任何二进制堆必须在级别(i)中具有2 ^ i个节点。

..............................(100)...................  2^0 nodes
............................./.....\..................  
...........................(19)...(36)................  2^1
........................../...\.../...\...............
.......................(17)..(3).(25).(1).............  2^2
......................./..\...........................
.....................(2).(7)..........................  last level.

因为上一级可能不完整所以n < 2^h

enter image description here

答案 1 :(得分:0)

位置k的任何节点的级别为floor(log2(k + 1))

因此,根据位置i生成的子树的高度是级别的差异(假设单个叶子的高度为0):height = floor(log2(n + 1)) - floor(log2(i + 1))

我们需要检查子树是否到达堆的底部或者是否缩短了一级。我们通过比较最左边的叶子和最后一个元素来做到这一点:

if(pow(2, height) * (i + 1) - 1 >= n)
    height--;

答案 2 :(得分:0)

简单的算法: - 向左走,直到你达到null。这可以通过left = 2*parent在二进制堆中完成。算法的时间复杂度为O(logn)。此外,您可以使用以下不等式直接评估它: - 2^k*i < N , k < log2(N/i) , k = log2(floor(N/i))。上述计算可以在O(log(log(n)))中高效完成,您需要在floor(N/i)中设置的最高位进行二进制搜索。

查找以整数设置的最高位: -

high = 63
low = 0
mid = 0
while(low<high) {

  mid = (low+high)>>1
  val = 1<<mid
  if(val==mid)
    return mid
  if(val>mid) {
     high = mid-1
  }
  else low = mid+1
}

return mid