并查集笔记

  我们知道,深度优先搜索和广度优先搜索可以找到目的路径路径,而路径在途中的表现为具有先后顺序的点的连接;而并查集并不关心我们要找的路径在图中是如何连接的,它只关心,点与点之间是否连接。

  比如:我们通过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 }

   以上就是并查集的全部基础内容。

  当然,对于并查集还有快速查找和快速合并的两种优化方式,等我熟练了再来补充(笑哭)。

posted on 2021-02-02 16:34  含光Aries  阅读(106)  评论(0编辑  收藏  举报