d 元堆中节点的子节点的索引公式

formula for index of a children of a node in a d-ary heap

假设我们有一个 d 元堆,我们从上到下和从左到右(从 1 开始)对节点进行索引。那么来自节点 i 的子节点是索引为 di,...,di+(d-1) 的节点。我在几本书中读到了这个公式,但其中 none 解释了为什么这些公式是正确的。也许我忽略了一些东西,但这些公式真的那么清楚吗?

也许这张图会有所帮助,至少对于 d=2:

 1
 2                       3
 4           5           6           7
 8     9    10    11    12    13    14    15
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

我为第一个 child 的索引找到 d * i + 2 - d,如果项目 从1开始编号。这是推理

每一行包含前一行的 children。如果 n[r] 是 行 r 上的项数,必须有 n[r+1] = d * n[r],其中 如果第一行的编号为 0,则证明 n[r] = d**r。指标 r 行第一项的总和为 f[r] = 1 + (d**r - 1)/(d - 1) 的几何序列。如果编号为 i 的项目 X 在行 r 上,让我们写 i = f[r] + k0 <= k < d**r。 X 之前的行中有 k 项, 因此在第 r+1 行 X 的第一个 child 之前有 d * k 个项目。这 X 的第一个 child 的索引是 f[r+1] + d * k = f[r+1] + d * (i - f[r]) 微积分为第一个 child.

的索引给出 d * i + 2 - d

实际上,如果我们从 0 而不是 1 开始对项目进行编号,对于第一个 child 的索引,公式就变得简单 d * i + 1,这可以很容易地通过归纳法证明,因为项目 i+1 的第一个 child 的索引是通过添加 d 获得的,但是 (d * i + 1) + d = d * (i + 1) + 1.