【问题标题】:Calculating Outdegree and Indegree of Adjacency list计算邻接表的出度和入度
【发布时间】:2017-07-05 11:53:56
【问题描述】:
问题
计算邻接列表的出度和入度的时间复杂度。
我的方法/怀疑
让 Adj[] 是一个大小为 V 的数组,其中 V=No。有向图中的顶点数
用于表示邻接表。
我知道,
顶点u的出度(u属于V)其实就是Adj[u]的长度
和
顶点u的入度(u属于V)实际上是u在列表Adj中的计数。
在这两种情况下,我认为时间复杂度应该是 theta (V*E)
其中 V=否。顶点数
E=no. of edges
因为为了计算出度,我们扫描所有顶点并在每个顶点下扫描该顶点的所有边。
那为什么是 Thrta (V+E)
请纠正我哪里错了?
谢谢!
【问题讨论】:
标签:
algorithm
graph
degrees
【解决方案1】:
好的,假设我们有 V 顶点和 E 边。
在双向和单向图中,对于每条边 Ei,我们得到两个顶点 V1,V2。我们可以很容易地得到边的方向,并更新某个顶点的出度和入度计数器。
示例:
顶点:1、2、3、4
边:1 -> 2, 2 -> 4, 3 -> 1, 2 -> 3
出度:0 0 0 0
度数:0 0 0 0
通过 1:
边 1 -> 2
出度:1 0 0 0
度数:0 1 0 0
通过 2:
边 2 -> 4
出度:1 1 0 0
度数:0 1 0 1
第 3 关:
边 3 -> 1
出度:1 1 1 0
度数:1 1 0 1
第 4 关:
边 2 -> 3
出度:1 2 1 0
度数:1 1 1 1
所以在这里,我们需要对每条边和每个顶点执行一次循环,从而导致复杂度 (V + E)。
【解决方案2】:
我们可以分配一个大小为 |V| 的数组 arr[]并将其条目初始化为零。然后我们只需要扫描 Adj 中的列表一次,当我们在列表中看到 u 时增加 arr [u]。
arr[] 中的值将是每个顶点的出度。这可以在 Θ (|V| + |E|) 时间内完成,并有 Θ (|V|) 额外的存储空间。