我正在阅读有关Heaps的内容,其中介绍了您可以执行访问左侧孩子的操作, RIGHT / LEFT 子项以及 PARENT 带位移操作。虽然左派和父母似乎微不足道,但我不确定是否正确。我只需添加一个吗?
以下是本书的摘录:MIT介绍算法:
“类似地, RIGHT 过程可以通过将i左边的二进制表示移位一位位置然后加1作为低位”来快速计算2i + 1“。
访问操作:
左:2 *我
i<<1
右:2 * i + 1
(i<<1)+1
父母:i / 2
i>>1
答案 0 :(得分:0)
这就是堆的工作原理 - 对于您可以轻松获得的每个节点:
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)
返回true
时C
是N
的右子或左子。然后:
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
不正确,因为{{1}是偶数,N1 * 2
是奇数。请注意,您的按位访问操作不正确 - 您应该将索引移1而不是2,因为N2 * 2 + 1
是N << M
。我还建议您使用普通除法/乘法而不是位移 - 编译器知道如何优化代码。
答案 1 :(得分:0)
Int i
左移一位位置相当于2*i
如果我们将i视为数组的索引:
- 可以使用以下方式获得左孩子的索引:
i << 1
- 正确孩子的指数
(i<<1)+1
- 父母:
i>>1
(相当于i / 2)
不要忘记我们在这种情况下考虑数组的初始索引是1。