如何知道二进制堆中的索引是否在奇数级别上

How to know if an index in a binary heap is on an odd level?

本文关键字:是否 索引 二进制 何知道      更新时间:2023-10-16

如果我有一个二进制堆,其典型属性为位置"pos"的左邻居为(2*pos)+1,右邻居为(2*pos)+2,父节点在(pos-1))/2,我如何有效地确定给定索引是否表示奇数级别的节点(根级别为0)?

(免责声明:这是基于Jarod42的评论的更完整的答案)

你想要的公式是:

floor(log2(pos+1)) mod 2

要了解原因,请查看前几个节点的级别:

           0               Level: 0
      1          2                1
   3    4     5     6             2
 7  8  9 10 11 12 13 14           3
0 -> 0
1 -> 1
2 -> 1
3 -> 2
...
6 -> 2
7 -> 3
...

第一步是找到一个函数,以这种方式将节点号映射到关卡号。在数字上加1,取以2为基数的对数,几乎(但不完全)会得到你想要的结果:

log2 (0+1) = log2 1 = 0
log2 (1+1) = log2 2 = 1
log2 (2+1) = log2 3 = 1.6 (roughly)
log2 (3+1) = log2 4 = 2
....
log2 (6+1) = log2 7 = 2.8 (roughly)
log2 (7+1) = log2 8 = 3

从这里可以看到,在每种情况下,舍入到最接近的整数将得到每个节点的级别,因此我们得到floor(log2(pos+1))

正如Jarod42所说,这是一种观察水平数奇偶性的情况,这只涉及到数字mod 2。这将给出0(电平为偶数)或1(电平为奇数)。