KRUSKAL 最小生成树算法
https://mp.weixin.qq.com/s/dJ9gqR3RVoeGnATlpMG39w
Kruskal 算法其实很容易理解和记忆,其关键是要熟悉并查集算法,如果不熟悉,建议先看下前文 Union-Find 并查集算法。
最小生成树的定义见上文。
所谓最小生成树,就是图中若干边的集合(我们后文称这个集合为mst
,最小生成树的英文缩写),你要保证这些边:
1、包含图中的所有节点。
2、形成的结构是树结构(即不存在环)。
3、权重和最小。
有之前题目的铺垫,前两条其实可以很容易地利用 Union-Find 算法做到,关键在于第 3 点,如何保证得到的这棵生成树是权重和最小的。
这里就用到了贪心思路(Greedy Algorithm):
将所有边按照权重从小到大排序,从权重最小的边开始遍历,如果这条边和mst
中的其它边不会形成环,则这条边是最小生成树的一部分,将它加入mst
集合;否则,这条边不是最小生成树的一部分,不要把它加入mst
集合。
这样,最后mst
集合中的边就形成了最小生成树,下面我们看两道例题来运用一下 Kruskal 算法。
Refer: Leetcode 1135,1584
最后说下 Kruskal 算法的复杂度分析:
假设一幅图的节点个数为V
,边的条数为E
,首先需要O(E)
的空间装所有边,而且 Union-Find 算法也需要O(V)
的空间,所以 Kruskal 算法总的空间复杂度就是O(V + E)
。
时间复杂度主要耗费在排序,需要O(ElogE)
的时间,Union-Find 算法所有操作的复杂度都是O(1)
,套一个 for 循环也不过是O(E)
,所以总的时间复杂度为O(ElogE)
。
本文就到这里,关于这种贪心思路的简单证明以及 Prim 最小生成树算法,我们留到后续的文章再聊。
Last updated