并查集:用数组实现
思路
数组里存的数字代表所属的集合。比如arr[4]==1;代表4是第一组。如果arr[7]==1,代表7也是第一组。既然 arr[4] == arr[7] == 1 ,那么说明4 和 7同属于一个集合,
代码
/**
* 数组实现并查集,元素内数字代表集合号
*/
public class UnionFind {
/**
* 数组,表示并查集所有元素
*/
private int[] id;
/**
* 并查集的元素个数
*/
private int size;
/**
* 构造一个新的并查集
*
* @param size 初始大小
*/
public UnionFind(int size) {
//初始化个数
this.size = size;
//初始化数组,每个并查集都指向自己
id = new int[size];
for (int i = 0; i < size; i++) {
id[i] = i;
}
}
/**
* 查看元素所属于哪个集合
*
* @param element 要查看的元素
* @return element元素所在的集合
*/
private int find(int element) {
return id[element];
}
/**
* 判断两个元素是否同属于一个集合
*
* @param firstElement 第一个元素
* @param secondElement 第二个元素
* @return <code>boolean</code> 如果是则返回true。
*/
public boolean isConnected(int firstElement, int secondElement) {
return find(firstElement) == find(secondElement);
}
/**
* 合并两个元素所在的集合,也就是连接两个元素
*
* @param firstElement 第一个元素
* @param secondElement 第二个元素
*/
public void unionElements(int firstElement, int secondElement) {
//找出firstElement所在的集合
int firstUnion = find(firstElement);
//找出secondElement所在的集合
int secondUnion = find(secondElement);
//如果这两个不是同一个集合,那么合并。
if (firstUnion != secondUnion) {
//遍历数组,使原来的firstUnion、secondUnion合并为secondUnion
for (int i = 0; i < this.size; i++) {
if (id[i] == firstUnion) {
id[i] = secondUnion;
}
}
}
}
/**
* 本并查集使用数组实现,为了更直观地看清内部数据,采用打印数组
*/
private void printArr() {
for (int id : this.id) {
System.out.print(id + "\t");
}
System.out.println();
}
public static void main(String[] args) {
int n = 10;
UnionFind union = new UnionFind(n);
System.out.println("初始:");
union.printArr();
System.out.println("连接了5 6");
union.unionElements(5, 6);
union.printArr();
System.out.println("连接了1 2");
union.unionElements(1, 2);
union.printArr();
System.out.println("连接了2 3");
union.unionElements(2, 3);
union.printArr();
System.out.println("连接了1 4");
union.unionElements(1, 4);
union.printArr();
System.out.println("连接了1 6");
union.unionElements(1, 6);
union.printArr();
System.out.println("1 5 是否连接:" + union.isConnected(1, 5));
System.out.println("1 8 是否连接:" + union.isConnected(1, 8));
}
}
并查集:借助树形结构
待续....
并查集优化:路径压缩
待续....