Algorithm 计算每个节点的总和';邻居';度?
对于无向图中的每个节点u,让twodegree[u]是u的相邻节点的度数之和。演示如何在线性时间内计算twodegree[.]值的整个数组,给定邻接列表格式的图形 这就是解决办法Algorithm 计算每个节点的总和';邻居';度?,algorithm,graph,pseudocode,Algorithm,Graph,Pseudocode,对于无向图中的每个节点u,让twodegree[u]是u的相邻节点的度数之和。演示如何在线性时间内计算twodegree[.]值的整个数组,给定邻接列表格式的图形 这就是解决办法 for all u ∈ V : degree[u] = 0 for all (u; w) ∈ E: degree[u] = degree[u] + 1 for all u ∈ V : twodegree[u] = 0 for all (u; w) ∈ E: twodegree[u
for all u ∈ V :
degree[u] = 0
for all (u; w) ∈ E:
degree[u] = degree[u] + 1
for all u ∈ V :
twodegree[u] = 0
for all (u; w) ∈ E:
twodegree[u] = twodegree[u] + degree[w]
有人能解释一下度[u]在这种情况下是什么,以及twodegree[u]=twodegree[u]+degree[w]应该是u的邻居的度之和吗?这里,
degree[u]
是节点的度u
(即,相邻节点的数量)。您可以看到,这是由第一个循环计算的,它在图中的所有边上迭代,并为图中的每条边增加degree[u]
然后,第二个循环在图中的每个节点上迭代,并计算其所有相邻节点的度数之和。它使用预先计算度[u]
的事实,以便在O(m+n)时间内运行
希望这有帮助 这里,
degree[u]
是节点u
的度数(即与之相邻的节点数)。您可以看到,这是由第一个循环计算的,它在图中的所有边上迭代,并为图中的每条边增加degree[u]
然后,第二个循环在图中的每个节点上迭代,并计算其所有相邻节点的度数之和。它使用预先计算度[u]
的事实,以便在O(m+n)时间内运行
希望这有帮助 除了@templatetypedef所说的,语句
twodegree[u]=twodegree[u]+degree[w]
简单地跟踪u
的twodegree,同时不断迭代(或累积)添加其邻居(临时存储在w
中)的度数除了@templatetypedef所说的,语句twodegree[u]=twodegree[u]+degree[w]
简单地跟踪u
的twodegree,同时不断迭代(或累积)添加其邻居(临时存储在w
中)的度数。您能解释一下这是O(n+m)吗?有两个for循环,一个在另一个内部。如何是线性时间而不是O(nm)?@SharhadBashar通过将外循环的迭代次数乘以内循环的最大迭代次数,可以保守地将运行时限制在O(mn),但这个限制不会很紧。与其继续这样做,不如考虑内部循环在外部循环的所有迭代中运行的总次数。图中总共只有m条边,所以在所有迭代中,内循环只能运行O(m)次。这里所做的功是边的O(m)加上所有其他功的O(n),总共O(m+n)。你能解释一下这是怎么回事吗?有两个for循环,一个在另一个内部。如何是线性时间而不是O(nm)?@SharhadBashar通过将外循环的迭代次数乘以内循环的最大迭代次数,可以保守地将运行时限制在O(mn),但这个限制不会很紧。与其继续这样做,不如考虑内部循环在外部循环的所有迭代中运行的总次数。图中总共只有m条边,所以在所有迭代中,内循环只能运行O(m)次。这里所做的功是O(m)的边加上O(n)的所有其他功,总共O(m+n)。