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] + k
与 0 <= 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
.
假设我们有一个 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] + k
与 0 <= 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
.