数据结构之并查集

37 阅读1分钟

并查集主要包含两个方法

  • int find(int x) 查找x所在集合的代表元
  • void join(int x, int y) 合并x和y所在的两个集合

其中实现查找和合并的算法有多种,可自行进行查阅。并查集中的路径压缩和按秩合并。

整体算法和数据结构还是比较好理解的,后面写相关的算法能应用才是更重要的。

/**
 * 并查集
 * @author Eric
 *
 */
public class UnionFindDisjointSets {
	/**
	 * pre[x] = y 表示x的前继节点是y
	 */
	private int[] pre;
	
	public UnionFindDisjointSets() {
		pre = new int[1000];
	}
	public UnionFindDisjointSets(int[] pre) {
		this.pre = pre;
	}

	/**
	 * 寻找元素x所在集合的代表元
	 * @param x
	 * @return 代表元
	 */
	public int find(int x) {
		if(pre[x] != x) {
			pre[x] = find(pre[x]);
		}
		return pre[x];
	}
	
	/**
	 * 将x和y所在的两个集合进行合并
	 * @param x
	 * @param y
	 */
	public void join(int x, int y) {
		int m1 = find(x);
		int m2 = find(y);
		pre[m1] = m2;
	}
}