Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm D元堆:父函数(inti)和子函数(inti)后面的直觉';实施_Algorithm_Heap - Fatal编程技术网

Algorithm D元堆:父函数(inti)和子函数(inti)后面的直觉';实施

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元堆中,父函数和子函数的实现方式如下

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:)