[英]Heap Bit-Shift Macros for Left, Right and Parent
这是堆的工作方式-对于每个节点,您都可以轻松获得:
N / 2
) N * 2
) N * 2 + 1
) 很容易证明,两个不同的节点不能具有相同的子节点。
假设N1
, N2
和C
是堆节点。 N1 != N2
以及C.is_child_of(N1)
和C.is_child_of(N2)
,其中C.is_child_of(N)
当C
是N
左或右子C.is_child_of(N)
时返回true
。 然后:
C
是N1
和N2
的左子代,则N1 * 2 = N2 * 2 <=> N1 = N2
C
是N1
和N2
的右子,则N1 * 2 + 1 = N2 * 2 + 1 <=> N1 = N2
C
是N1
的左子代,而C
是N2
的右子代,则N1 * 2 = N2 * 2 + 1
是不正确的,因为N1 * 2
为偶数, N2 * 2 + 1
为奇数。 请注意,按位访问操作不正确-您应该将索引移位1,而不是2,因为N << M
为N * 2^M
我还建议您使用普通除法/乘法而不是移位-编译器知道如何优化代码。
Int i
上左移一位的位置等于2*i
如果我们将i作为数组的索引:
-左孩子的索引可以使用以下方法获得:
i << 1
-正确的孩子的索引
(i<<1)+1
-父母:
i>>1
(相当于i / 2)
不要忘记我们在这种情况下认为数组的初始索引为1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.