如何知道二进制堆中的索引是否在奇数级别上
How to know if an index in a binary heap is on an odd level?
如果我有一个二进制堆,其典型属性为位置"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
(电平为奇数)。
相关文章:
- 如何检查类实例向量的索引是否为空
- 是否可以在 OpenGL 中的同一调用中呈现两个具有不同索引起点的不同缓冲区?
- 使用枚举为数组编制索引是否安全?
- 是否可以将变体的索引作为 constexpr 变量获取?
- 在擦除或修改作为不同索引键的值时,boost::multi_index 迭代器是否无效?
- C++如何获取索引I处的元素,并检查它在向量或数组中是否为空
- 是否有一个类似STL的函数来用索引的某个函数填充数组
- 是否允许将列移动到索引 0?
- 是否可以在C++中获得索引迭代器?
- 是否可以将结构分配给向量的索引?
- C++:检查向量中的元素是否大于另一个具有相同索引的元素的有效方法?
- 是否可以创建带有索引但没有指针的单个链表?
- Rust 在索引时是否隐式创建映射条目,例如C++
- 如何检查数组中的索引是否为空
- 是否有C 功能来计算两个索引之间的距离
- 是否可以从特征中的 1 开始索引矩阵?
- 是否可以使用字符串或字符索引数组
- 如何确定未知类型数组的索引是否为空
- 是否可以使用一系列智能指针来自动通过其索引更新其值
- 如何检查向量是否包含指定索引中的特定字符