algorithm - 为什么在由数组实现的堆中,索引 0 未被使用?

标签 algorithm heap

我正在学习数据结构,每个来源都告诉我在实现堆时不要使用数组的索引 0,但没有给出任何解释原因。我搜索了网络,搜索了 StackExchange,但找不到答案。

最佳答案

在数组中实现的堆没有理由必须让索引 0 处的项目未被使用。如果将根置于 0,则 array[index] 中的项目在 array[index*2+1]array[index* 2+2]array[child] 中的节点在 array[(child-1)/2] 中有其父节点。

让我们看看。

                  root at 0       root at 1
Left child        index*2 + 1     index*2
Right child       index*2 + 2     index*2 + 1
Parent            (index-1)/2     index/2

因此,让根位于 0 而不是 1 会花费额外的加法来找到左边的 child ,并需要额外的减法来找到父节点。

对于更一般的情况,它可能不是二叉堆,而是 3 堆、4 堆等,其中每个节点有 NUM_CHILDREN 个子节点而不是 2 个,公式为:

                  root at 0                  root at 1
Left child        index*NUM_CHILDREN + 1     index*NUM_CHILDREN
Right child       index* NUM_CHILDREN + 2    index*NUM_CHILDREN + 1
Parent            (index-1)/NUM_CHILDREN     index/NUM_CHILDREN

我看不出那些额外的指令对运行时间有多大影响。

关于为什么我认为在具有基于 0 的数组的语言中从 1 开始是错误的原因,请参阅 https://stackoverflow.com/a/49806133/56778和我的博文 But that's the way we've always done it!

关于algorithm - 为什么在由数组实现的堆中,索引 0 未被使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22900388/

相关文章:

ruby - 如何在不使用乘法的情况下对数字进行平方?

c - glibc的free()的内部工作原理

c++ - 如何在给定数组中找到某个固定给定长度的每个子数组的最大值

algorithm - 使用数组的合并排序的空间复杂度

javascript - 如何强制 node.js 进行更深层次的递归?

c++ - 更改 vector 中的值后,make_heap 无法按预期工作?

algorithm - 无法理解 K-way 合并算法(给出了反例)

java - 在大型未排序列表中查找 n 个最大值,一次仅处理一页值

javascript - 优先队列中的比较器 : Javascript

java - 改变多维树的 "perspective"