有人可以向我解释为什么使用相邻矩阵的Prim算法导致O(V2)
的时间复杂度?
答案 0 :(得分:6)
(对于看起来粗鄙的ASCII数学提前抱歉,我认为我们不能使用LaTEX来排版答案)
实现具有O(V^2)
复杂度的Prim算法的传统方法是除了邻接矩阵之外还有一个数组,让我们称之为distance
,它具有该顶点到节点的最小距离。 / p>
这样,我们只检查distance
以查找下一个目标,因为我们执行此操作V次并且有distance
的V成员,我们的复杂度为O(V^2)
。< / p>
由于distance
中的原始值很快就会过时,因此它本身就不够了。要更新此数组,我们所做的就是在每个步骤结束时,遍历我们的邻接矩阵并适当更新distance
。这不会影响我们的时间复杂度,因为它仅意味着每个步骤都需要O(V+V) = O(2V) = O(V)
。因此,我们的算法是O(V^2)
。
在不使用distance
的情况下,我们必须每次迭代所有E边,最坏的情况是包含V ^ 2边,这意味着我们的时间复杂度为O(V^3)
。
证明:
要证明如果没有distance
数组,则无法在O(V^2)
时间内计算MST,请考虑在每次迭代时使用大小为n
的树,有{{} 1}}可能会添加顶点。
要计算选择哪一个,我们必须检查每一个以找到它们与树的最小距离,然后将它们相互比较并找到最小值。
在最坏的情况下,每个节点都包含与树中每个节点的连接,从而产生n *(V-n)个边缘和V-n
的复杂性。
由于n从1到V,我们的总数将是每个步骤的总和,我们的最终时间复杂度为:
O(n(V-n))
QED
答案 1 :(得分:6)
注意:这个答案只是借用jozefg's answer并试图更充分地解释它,因为在我理解之前我必须先思考一下。
图的邻接矩阵表示构造V x V矩阵(其中V是顶点的数量)。单元格(a,b)的值是连接顶点a和b的边的权重,如果没有边,则为零。
Adjacency Matrix
A B C D E
--------------
A 0 1 0 3 2
B 1 0 0 0 2
C 0 0 0 4 3
D 3 0 4 0 1
E 2 2 3 1 0
Prim的算法是一种算法,它采用图形和起始节点,并在图形上找到最小生成树 - 也就是说,它找到边缘的子集,以便结果是包含所有节点的树,并且组合的边权重被最小化。可归纳如下:
我们现在可以开始像这样分析算法:
然而,jozefg给出了一个很好的答案,展示了如何实现O(V ^ 2)的复杂性。
Distance to Tree
| A B C D E
|----------------
Iteration 0 | 0 1* # 3 2
1 | 0 0 # 3 2*
2 | 0 0 4 1* 0
3 | 0 0 3* 0 0
4 | 0 0 0 0 0
NB. # = infinity (not connected to tree)
* = minimum weight edge in this iteration
此处距离向量表示将每个节点连接到树的最小加权边,并按如下方式使用:
使用这三个步骤可以缩短从O(E)到O(V)的搜索时间,并在每次迭代时添加额外的O(V)步骤来更新 distance 向量。由于每次迭代现在都是O(V),因此整体复杂度为O(V ^ 2)。
答案 2 :(得分:0)
首先,它显然至少是O(V ^ 2),因为这是邻接矩阵的大小。
查看http://en.wikipedia.org/wiki/Prim%27s_algorithm,您需要执行“重复直到Vnew = V”步骤V次。
在该步骤中,您需要计算V中任何顶点与V外的任何顶点之间的最短链接。维护一个大小为V的数组,保持每个顶点无穷大(如果顶点为V)或长度V中任何顶点与该顶点之间的最短链接及其长度(所以在开始时这只是起始顶点和每个其他顶点之间的链接长度)。要找到要添加到V的下一个顶点,只需按成本V搜索此数组。一旦有了新顶点,查看从该顶点到每个其他顶点的所有链接,看看它们中是否有任何链接从V到那个顶点。如果是,请更新阵列。这也花费了V。
所以你有V步(V顶点要添加)每个花费成本V,这给你O(V ^ 2)