案例1:简单的实现方式,直接遍历
代码:
package me.ele.union_find;
import java.util.Arrays;
import java.util.List;
/**
* 快速查找 UC(union find)
* <p>
* 有一些元素 a b c d e f g h ......
*
* @author LZJ
* @create 2018-10-03 13:40
**/
public class QuickFindUF {
private int[] idArr;
/**
* 初始化 数组,数组中每个位置上元素的值 即 元素的下标
*
* @param n
*/
public QuickFindUF(int n) {
idArr = new int[n];
for (int i = 0; i < n; i++) {
idArr[i] = i;
}
}
/**
* 给定两个元素,查询两个元素是否在统一集合内
*
* @param p
* @param q
* @return 如果两个元素在数组中的值 相等,即代表两个元素连通
*/
public boolean find(int p, int q) {
return idArr[p] == idArr[q];
}
/**
* 合并两个元素 即 将两个元素连通
* 每次合并 两个元素的时候,遍历当前数组,将其中所有符合(值与p元素的值相等的)所有元素 替换为q的值
* 这样,p元素以及之前的符合条件的元素 都会与q元素合并(连通)
*
* @param p
* @param q
*/
public void union(int p, int q) {
int length = idArr.length;
for (int i = 0; i < length; i++) {
if (idArr[i] == idArr[p]) {
idArr[i] = idArr[q];
}
}
}
}
测试:
public static void main(String[] args) {
// [0-9]十个元素放置到数组 idArr 之所以使用0-9不重复的数字 是因为想要唯一区分每个元素
QuickFindUF quickFindUF = new QuickFindUF(