为什么在由数组实现的堆中未使用索引0?
问题内容:
我正在学习数据结构,每个源都告诉我在实现堆时不要使用数组的索引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会花费额外的费用来找到左子,并加上减法来找到父。
对于更一般的情况,它可能不是二进制堆,而是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
我看不到这些额外的指令对运行时间有很大的影响。