并查集
Union-Find 算法的复杂度可以这样分析:构造函数初始化数据结构需要 O(N) 的时间和空间复杂度;连通两个节点 union
、判断两个节点的连通性 connected
、计算连通分量 count
所需的时间复杂度均为 O(1)。
题目
一、只使用图的连通性,或求连通分量数:
419. 甲板上的战舰(与200题类似)
二、其他问题转换成求连通性:
三、复杂的路径压缩
四、最小生成树(后文称mst
)
mst
)最小生成树,就是图中若干边的集合,你要保证这些边:
1、包含图中的所有节点。
2、形成的结构是树结构(即不存在环)。
3、权重和最小。
用到了贪心思路(Kruskal 算法):
将所有边按照权重从小到大排序,从权重最小的边开始遍历,如果这条边和mst
中的其它边不会形成环,则这条边是mst
的一部分,将它加入mst
集合;否则,这条边不是最小生成树的一部分,不要把它加入mst
集合。
求连通所有结点的最少路径之类的问题,就是求树(没有环才能减少路径),并且是最小生成树
复杂度
假设一幅图的节点个数为V
,边的条数为E
,首先需要O(E)
的空间装所有边,而且 Union-Find 算法也需要O(V)
的空间,所以 Kruskal 算法总的空间复杂度就是O(V + E)
。
时间复杂度主要耗费在排序,需要O(ElogE)
的时间,Union-Find 算法所有操作的复杂度都是O(1)
,套一个 for 循环也不过是O(E)
,所以总的时间复杂度为O(ElogE)
。
最后更新于