假设我们有一个d-ary堆,我们从上到下,从左到右(从1开始)索引节点。然后来自节点i的子节点是索引为d i,...,d i +(d-1)的节点。我在几本书中读到了这个公式,但没有一个是解释为什么这些公式是真的。也许我忽视了一些事情,但这些公式是否真的很清楚呢?
答案 0 :(得分:1)
我找到d * i + 2 - d
作为第一个孩子的索引,如果是项目
从1开始编号。这是推理
每行包含上一行的子项。如果是n[r]
行r
上的项目数量,必须有n[r+1] = d * n[r]
,其中
如果第一行的编号为n[r] = d**r
,则证明0
。该指数
行r
的第一项的总和为f[r] = 1 + (d**r - 1)/(d - 1)
几何序列。如果编号为i
的项目X位于行r
上,请让我们写一下
i = f[r] + k
0 <= k < d**r
k
。在X之前的行上有d * k
个项目,
因此在X的第一个孩子在第r + 1行之前有f[r+1] + d * k = f[r+1] + d * (i - f[r])
项。该
X的第一个孩子的索引是d * i + 2 - d
微积分为第一个孩子的索引提供d * i + 1
。
实际上,如果我们开始将项目从0而不是1开始编号,那么对于第一个孩子的索引,公式变为i+1
,这很容易通过归纳证明,因为第一个孩子的索引项目d
是通过添加(d * i + 1) + d = d * (i + 1) + 1
获得的,但quantlib
。
答案 1 :(得分:-1)
这个图表可能会有所帮助,至少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