以下来自于leetcode
使用数据结构:并查集
- 思路:由于相等关系具有传递性,所有相等的变量属于同一个集合;
- 只关心连通性,不关心距离,因此很容易想到并查集。(很容易嘛,反正我想不到)
并查集
- 「并查集」用于判断一对元素是否相连,它们的关系式动态添加的,这一类问题叫做「动态连通性」问题;
- 主要支持「合并」与「查询是否在同一个集合」操作;
- 底层结构是「数组」或者「哈希表」,用于表示「节点」指向「父节点」,初始化时指向自己;
- 「合并」就是把一个集合的根节点指向另一个集合的根节点,只要根节点一样,就表示在同一个集合里;
- 这种表示「不相交集合」的方法称之为「代表元法」,以每个结点的根节点作为一个集合的「代表元」。
- 「路径压缩」和「按秩压缩」一起使用的时候,难以维护「秩」准确的定义,但依然具有参考价值。
- 同时使用「路径压缩」和「按秩合并」,
「合并」
与「查询」
的时间复杂度接近O(1); - 「并查集」的时间复杂度分析,可以在互联网上搜索相关资料学习;
- 一般而言,「路径压缩」和「按秩合并」使用其中一个即可。
并查集的应用
- 最小生成树:Kruskal算法
并查集的优化1:路径压缩(Path Compression)
并查集的优化2:按「秩」(Rank)合并
- 「按秩合并」是指在合并的过程中,使得「高度」更低的树的根节点指向「高度」更高的根节点,以避免合并以后的树高度增加;
990.等式方程的可满足性。
以下来自于算法视频笔记并查集(union & find)是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。Union:将两个子集合并成同一个集合。
在生活中的例子
- 小弟——>老大
- 帮派识别
- 两种优化方式
初始化
并查集原始版代码
并查集优化一
并查集优化二
优化二效率更高,直接指向根节点,不需要添加rank属性。
实战题目
- number-of-islands
- friend-circles
岛屿个数
方法一:染色问题(FloodFill)
A.遍历节点:
具体代码:
方法二:并查集
A.初始化:针对’1’结点
B.遍历所有节点,相邻节点合并;'1’合并,'0’不管
C.遍历(找不同的parents,可以在第二步进行统计)
朋友圈
可以转化为岛屿问题