LeetCode Union-Find(并查集) 专题(二)
并查集 Union-Find 的适用情况
如何考虑使用并查集
从并查集的功能入手, 显然题目要求有 “查询”, “合并” 操作时可以考虑使用。重点是合并。(单考虑查询用map即可)并且注意到这种合并应该是不需要记录合并路径的。(这是由于路径压缩会破坏原有路径, 破坏了原有的树结构)
从我做到的题来看, 并查集的使用具有很明显的特点。 一是经常和BFS或DFS相似。即看上去可以用BFS或者DFS解决。 二是具有数据分类的特性。 这里的分类比较抽象。 对于一些问题可能会直接给出一个关系对向量或者一个关系矩阵, 有些问题则比较隐晦一些。 例如下面将要谈到的区间上的合并(线段合并),合并的条件是隐性的: 相邻的数字都是同类。
并查集的优势
的确很多并查集的题目都可以利用BFS + DFS得到解决。 但是有一些问题是不能够或者说不便于利用BFS或DFS。 下面举一个例子。
ProblemA: 给出一个大小为
n*n
的关系矩阵, 要求输出合并后的连通块数。
对于上面的问题, DFS 和 BFS 完全可以胜任。 复杂度即为 O(N2) .
反而用并查集不能够做到很好。 之后的详细的复杂度分析可以知道, 即使使用并查集除非做了很好的优化, 否则达到 O(1)