Algorithm D元堆:父函数(inti)和子函数(inti)后面的直觉';实施
在D元堆中,父函数和子函数的实现方式如下Algorithm D元堆:父函数(inti)和子函数(inti)后面的直觉';实施,algorithm,heap,Algorithm,Heap,在D元堆中,父函数和子函数的实现方式如下 D-ARY-PARENT(i) return (i − 2)/d + 1 D-ARY-CHILD(i, j) return d(i − 1) + j + 1 有人能给出这些表达式背后的直觉吗?这些函数假定节点按照广度优先搜索访问它们的顺序进行标记。通用BFS算法如下所示: initialize a queue Q = [root] while Q is not empty pop the head from Q into v push
D-ARY-PARENT(i)
return (i − 2)/d + 1
D-ARY-CHILD(i, j)
return d(i − 1) + j + 1
有人能给出这些表达式背后的直觉吗?这些函数假定节点按照广度优先搜索访问它们的顺序进行标记。通用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元树时,该算法变得(天真地)
我们观察到,推送到队列中的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
的增长速度是nextParentID
的两倍,因此这种关系应该是线性的。我个人对常数项没有任何直觉,除了尝试和错误。您可以通过归纳来证明公式。这些函数假定节点按照广度优先搜索访问它们的顺序进行标记。通用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元树时,该算法变得(天真地)
我们观察到,推送到队列中的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
的增长速度是nextParentID
的两倍,因此这种关系应该是线性的。我个人对常数项没有任何直觉,除了尝试和错误。你可以用归纳法来证明这些公式。你从哪里得到这些表达式的?您希望根节点位于索引0还是索引1?子计算中的j
是什么?索引从1开始。第二个函数查找第i个节点的第j个子节点。这些子节点来自Korman的书。我觉得更像K:)YesIt的C:)你从哪里得到这些表情的?您希望根节点位于索引0还是索引1?子计算中的j
是什么?索引从1开始。第二个函数查找第i个节点的第j个子节点。这些子节点来自Korman的书。我觉得更像K:)YesIt的C:)