D-ary堆:直接在父(int i)和子(int i)函数的实现之后

时间:2017-05-09 19:58:38

标签: algorithm heap

在D-ary堆中,父和子函数就像这样实现

D-ARY-PARENT(i)
return (i − 2)/d + 1

D-ARY-CHILD(i, j)
return d(i − 1) + j + 1

任何人都可以在这些表达背后给出直觉吗?

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}}倍,因此关系应该是线性的。除了反复试验之外,我个人对常数术语没有任何直觉。你可以通过归纳来证明这些公式。