并查集笔记
我们知道,深度优先搜索和广度优先搜索可以找到目的路径路径,而路径在途中的表现为具有先后顺序的点的连接;而并查集并不关心我们要找的路径在图中是如何连接的,它只关心,点与点之间是否连接。
比如:我们通过BFS或者DFS得到的目的路径为 1,2,3,4 ; 而在并查集中,而不一定会知道 1 是源端, 4 是目的端,我们只知道1,2,3,4之间是相互连通的,并且他们有一个共同的根节点。
并查集的操作分为三步:初始化,查找、合并。
1、初始化:
定义一个parent数组,数组索引代表该节点,数组元素的值代表对应索引的根,在初始化阶段,每个元素的根为他自己。
int []parent; public UnionFind(int n) { this.parent = new int[n]; for (int i = 0; i < n; i++) { parent[i] = -1; //代表元素i的根节点为-1,即它本身 } }
2、查找:在并查集中,相互连接的点的表现形式为一个树,我们可以通过递归或者迭代的方式找到根,
迭代方式查找:
public int find(int x) { while (x != parent[x]) { x = parent[x]; } return x; }
递归方式查找:
public int find(int x) { return parent[x] == x ? x : (parent[x] = find(parent[x])); }
3、合并:合并就是我们通过某种判断需要将两个点合并在一棵树上。
1 public void union(int x, int y) { 2 int rootX = find(x); 3 int rootY = find(y); 4 if (rootX == rootY) { //表示二者已经在一棵树上 5 return; 6 } 7 parent[rootX] = rootY; 8 }
以上就是并查集的全部基础内容。
当然,对于并查集还有快速查找和快速合并的两种优化方式,等我熟练了再来补充(笑哭)。
你为什么不努力。。