我看到了这个问题,需要从邻接表表示法中计算每个节点的入度。
for each u
for each Adj[i] where i!=u
if (i,u) ∈ E
in-degree[u]+=1
现在根据我的理解,它的时间复杂度应该是
O(|V||E|+|V|^2)
,但我参考的解决方案却说它等于 O(|V||E|)
。请帮忙并告诉我哪个是正确的。
我看到了这个问题,需要从邻接表表示法中计算每个节点的入度。
for each u
for each Adj[i] where i!=u
if (i,u) ∈ E
in-degree[u]+=1
O(|V||E|+|V|^2)
,但我参考的解决方案却说它等于 O(|V||E|)
。for each u
indegree[u] = 0;
for each u
for each v \in Adj[u]
indegree[v]++;
第一次循环的复杂度为线性复杂度 O(|V|)。对于第二部分:对于每个 v,最内层循环最多执行 |E| 次,而最外层循环执行了 |V| 次。因此,第二部分似乎具有复杂度 O(|V||E|)。实际上,代码对每条边执行一次操作,因此更准确的复杂度是 O(|E|)。
O(|V| + |E|)
。DiGraph
对象的构造函数中看到的那样,networkx
跟踪self._succ
和self._pred
,它们是分别表示每个节点的后继和前驱的字典。这使得它能够有效地计算每个节点的in_degree
。O(|V|+|E|)
是正确的答案,因为你在 O(|V|)
中访问每个顶点,并且每次访问一部分边缘,所以总共是 O(|E|)
,通常也有 |E|>>|V|
,所以 O(|E|)
也是正确的。
for i in (0,n): do nothing
这样的循环的复杂度是n
还是1
? - AnshulO(|E|)
还是O(|E| + |V|)
呢?因为我们至少需要访问Adj(G)
中的所有顶点行。 - Anshul