邻接列表的效率顺序是什么

时间:2016-10-11 18:59:55

标签: algorithm graph-algorithm

O(n+m)还是O(nm)?要构建它是O(nm),如果我们想要搜索,添加或删除值O(n+m),对吧?还有什么重要的考虑因素吗?

同样要将矩阵转换为列表需要O(n 2 )并将列表转换为矩阵,只有O(nm)正确吗?

2 个答案:

答案 0 :(得分:0)

我认为当你将列表转换为矩阵时,你会去:

for each vertex `O(n)`
    for each neighbour `O(n)`

这就是为什么它也是O(n ^ 2)。

如果m> n,则一个顶点不能包含所有m个邻居,这就是为什么你要避免O(n^3)

为例:

a: b, c, d

b: a, c, d

c: a, b, d

d: a, b, c

完整图表:O(n^2)列表大小。虽然n = 4且m = 6,但尺寸为4x4而不是4x6。

(m =(4 *(4-1))/ 2 = 6 = O(n^2) - 完整图公式)

答案 1 :(得分:0)

  • 构建邻接列表的成本是从零开始的O(m)(因为我们可以在O(1)中添加任何边)和从邻接矩阵中添加O(n²)(因为我们必须检查矩阵的每个单元格) )。
  • 添加边u-v是O(1)因为我们可以将一个条目v附加到顶点邻接列表的末尾u
  • 删除边缘u-v需要进行O(n)操作,因为我们必须扫描顶点u的邻接列表,以便在我们删除之前找到v的条目。
  • 查找是否存在边缘u-v也需要O(n)步,因为我们必须扫描顶点u的邻接列表并检查是否有v的条目

Remotion和搜索可以使用BST或散列而不是链接列表来改进O(logN)或平均O(1)来存储邻接,但大多数图算法要求我们扫描顶点的整个邻接列表而不是检查单个条目,所以我们通常可以很好地使用链接列表。

我们可以将邻接列表转换为O(m)中的邻接矩阵,假设矩阵最初用零填充。我们所要做的就是扫描每个顶点的邻接列表,对于每个具有权重W的边缘UV,我们可以做矩阵[U] [V] = W(或矩阵[U] [V] = 1,如果图形不是加权)。由于我们正在寻找每个边缘一次(如果图形未被定向,则为两次),复杂度为os(m)。