一尘不染

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

algorithm

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


阅读 294

收藏
2020-07-28

共1个答案

一尘不染

没有理由为什么在数组中实现的堆必须保留索引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会花费额外的费用来找到左子,并加上减法来找到父。

对于更一般的情况,它可能不是二进制堆,而是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

我看不到这些额外的指令对运行时间有很大的影响。

2020-07-28