左,右和父的堆位移宏

时间:2016-08-31 06:11:53

标签: python c++ algorithm heap

我正在阅读有关Heaps的内容,其中介绍了您可以执行访问左侧孩子的操作, RIGHT / LEFT 子项以及 PARENT 带位移操作。虽然左派和父母似乎微不足道,但我不确定是否正确。我只需添加一个吗?

以下是本书的摘录:MIT介绍算法:

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

MIT Introduction to Algorithms - Heap

访问操作:

左:2 *我

i<<1

右:2 * i + 1

(i<<1)+1

父母:i / 2

i>>1

2 个答案:

答案 0 :(得分:0)

这就是堆的工作原理 - 对于您可以轻松获得的每个节点:

  1. 父 - 只需将节点索引除以2(N / 2
  2. 左子 - 将索引乘以2(N * 2
  3. 右子项 - 将索引乘以2并将新索引增加一(N * 2 + 1
  4. 很容易证明,两个不同的节点不能拥有相同的子节点。

    假设N1N2C是堆节点。 N1 != N2以及C.is_child_of(N1)C.is_child_of(N2)C.is_child_of(N)返回trueCN的右子或左子。然后:

    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不正确,因为{{1}是偶数,N1 * 2是奇数。
    4. 请注意,您的按位访问操作不正确 - 您应该将索引移1而不是2,因为N2 * 2 + 1N << M。我还建议您使用普通除法/乘法而不是位移 - 编译器知道如何优化代码。

答案 1 :(得分:0)

Int i左移一位位置相当于2*i

如果我们将i视为数组的索引:
- 可以使用以下方式获得左孩子的索引:

i << 1

- 正确孩子的指数

(i<<1)+1

- 父母:

i>>1

(相当于i / 2)

不要忘记我们在这种情况下考虑数组的初始索引是1。