在D-ary堆中,父和子函数就像这样实现
D-ARY-PARENT(i)
return (i − 2)/d + 1
D-ARY-CHILD(i, j)
return d(i − 1) + j + 1
任何人都可以在这些表达背后给出直觉吗?
答案 0 :(得分:0)
这些函数假定节点按广度优先搜索将访问它们的顺序进行标记。通用BFS算法如下所示:
initialize a queue Q = [root]
while Q is not empty
pop the head from Q into v
push v's children into Q
当所讨论的树是无限的d-ary树时,该算法变为(天真地)
initialize a queue Q = [1]
nextID = 2
forever (Q is always nonempty)
pop the head of Q into v
repeat d times
let w = nextID (w is a child of v)
increment nextChildID
push w into Q
我们观察到推入队列的ID序列只有1,2,3 ......,所以我们可以省去队列。
nextParentID = 1
nextChildID = 2
forever
let v = nextParentID
increment nextParentID
repeat d times
let w = nextChildID (w is a child of v)
increment nextChildID
对于d = 3
,比如说,随着时间的推移执行似乎是
nextParentID: 1 1 1 2 2 2 3 3 3 4 4 4
nextChildID : 2 3 4 5 6 7 8 9 10 11 12 13
关键的想法是,nextChildID
的增加速度是d
的{{1}}倍,因此关系应该是线性的。除了反复试验之外,我个人对常数术语没有任何直觉。你可以通过归纳来证明这些公式。