繁体   English   中英

左,右和父对象的堆位移宏

[英]Heap Bit-Shift Macros for Left, Right and Parent

我正在阅读有关堆的文章,该文章描述了您可以通过位移操作来访问左子项, RIGHT / LEFT子项和PARENT 虽然“左撇子和父母”似乎微不足道,但我不确定右撇子是否正确。 我是否只需要添加一个?

这是本书的摘录:MIT算法简介:

“类似地, RIGHT过程可以通过将i的二进制表示左移一位位置,然后再添加1作为低阶位来快速计算2i +1。”

麻省理工学院算法概论-堆

访问操作:

左:2 * i

i<<1

右:2 * i + 1

(i<<1)+1

父母:i / 2

i>>1

这是堆的工作方式-对于每个节点,您都可以轻松获得:

  1. 父级-只需将节点索引除以2( N / 2
  2. 左子-索引乘以2( N * 2
  3. 右子-将索引乘以2并将新索引乘以1( N * 2 + 1

很容易证明,两个不同的节点不能具有相同的子节点。

假设N1N2C是堆节点。 N1 != N2以及C.is_child_of(N1)C.is_child_of(N2) ,其中C.is_child_of(N)CN左或右子C.is_child_of(N)时返回true 然后:

  1. 如果CN1N2的左子代,则N1 * 2 = N2 * 2 <=> N1 = N2
  2. 类似地,如果CN1N2的右子,则N1 * 2 + 1 = N2 * 2 + 1 <=> N1 = N2
  3. 如果CN1的左子代,而CN2的右子代,则N1 * 2 = N2 * 2 + 1是不正确的,因为N1 * 2为偶数, N2 * 2 + 1为奇数。

请注意,按位访问操作不正确-您应该将索引移位1,而不是2,因为N << MN * 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM