我正在学习数据结构,每个源都告诉我在实现堆时不要使用数组的索引0,而没有给出原因的任何解释。我搜索了网络,搜索了StackExchange,但找不到答案。
没有理由为什么在数组中实现的堆必须保留索引0处的项目未使用。如果您将根设为0,则位于的项目array[index]的子项位于array[index*2+1]和array[index*2+2]。的节点array[child]的父节点为array[(child-1)/2]。
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
我看不到这些额外的指令对运行时间有很大的影响。