给定n个值,我创建了一个Binary Max-Heap。我想知道计算任意位置的子树高度的公式i。
答案 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
答案 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