第一篇 并查集

252 阅读1分钟

简要介绍

并查集是很多高级数据结构的基础。它可以高效地查询几个事物是否属于同一个子类,高效地对几个子类进行合并,广泛被应用于解决各种连通性问题。

基本操作

并查集的基本操作有如下两个查询、合并。

  • 查询:得到某个元素所在类别的标签
  • 合并:将两个类别进行合并

代码实例

定义并查集类:

public class UnionFind {    
}

并查集初始化:(一般为每个元素定义一个类别)

private int[] labels;
public UnionFind(int n){
      labels = new int[n];
      for (int i = 0; i < n; i++) {
           labels[i] = i;
      }
}

并查集的实现方案主要有染色、树结构两种方案,每种方案有其自身的优点与缺点,现在逐个介绍如下:

染色方案

染色方案的合并操作,如以下代码:

public void union(int p, int q){
    int lab_p = labels[p], lab_q = labels[q];
    for (int i = 0; i < labels.length; i++) {
        if(lab_p == labels[i]){
            labels[i] = lab_q;
        }
    }        
}

查询操作,如以下代码:

public int find(int q){
    return labels[q];
}

其查询算法为常数时间复杂度,合并操作为线性时间复杂度。

树方案

树方案的查询操作如下:

public int find(int q){
   int parent = labels[q];
   while (parent != -1){
       q = parent;         //迭代查找该子树的根节点
       parent = labels[q];
   }
   return q;
}

树方案的合并操作如下:

// 将p类合并到q类,成为q类的子类
public void union(int p, int q){
   int parent_p = find(p), parent_q = find(q);
   labels[parent_p] = parent_q;
}

Leetcode题解