是O(n+m)
还是O(nm)
?要构建它是O(nm)
,如果我们想要搜索,添加或删除值O(n+m)
,对吧?还有什么重要的考虑因素吗?
同样要将矩阵转换为列表需要O(n 2 )并将列表转换为矩阵,只有O(nm)
正确吗?
答案 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)
Remotion和搜索可以使用BST或散列而不是链接列表来改进O(logN)或平均O(1)来存储邻接,但大多数图算法要求我们扫描顶点的整个邻接列表而不是检查单个条目,所以我们通常可以很好地使用链接列表。
我们可以将邻接列表转换为O(m)中的邻接矩阵,假设矩阵最初用零填充。我们所要做的就是扫描每个顶点的邻接列表,对于每个具有权重W的边缘UV,我们可以做矩阵[U] [V] = W(或矩阵[U] [V] = 1,如果图形不是加权)。由于我们正在寻找每个边缘一次(如果图形未被定向,则为两次),复杂度为os(m)。