并查集(Union-Find)是一种用于处理不相交集合(disjoint sets)合并及查询问题的数据结构。它支持两种操作:
find(查找)用于确定元素所属的集合,
union(合并)用于合并两个集合。为了优化性能,通常会使用路径压缩(Path Compression)和按秩合并(Union by Rank)两种技术。
下面是一个用 Java 实现的并查集,支持路径压缩和按秩合并:
javaCopy Codepublic class UnionFind { private int[] parent; // 存储每个节点的父节点
private int[] rank; // 存储每个节点的秩(用于按秩合并)
// 初始化并查集,n 是元素的数量
public UnionFind(int n) {
parent = new int[n];
rank = new int[n]; for (int i = 0; i < n; i++) {
parent[i] = i; // 每个节点的初始父节点是自己
rank[i] = 1; // 每个节点的初始秩为1
}
} // 查找操作,带路径压缩
public int find(int x) { if (parent[x] != x) {
parent[x] = find(parent[x]); // 递归路径压缩
} return parent[x];
} // 合并操作,按秩合并
public boolean union(int x, int y) { int rootX = find(x); int rootY = find(y); if (rootX == rootY) { return false; // x 和 y 已经在同一个集合中
} // 按秩合并
if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else {
parent[rootY] = rootX;
rank[rootX]++; // 如果秩相同,合并后根节点的秩加1
} return true;
} // 检查两个元素是否属于同一个集合
public boolean connected(int x, int y) { return find(x) == find(y);
} public static void main(String[] args) { UnionFind uf = new UnionFind(10);
uf.union(1, 2);
uf.union(3, 4);
uf.union(2, 4);
System.out.println(uf.connected(1, 4)); // 输出 true,因为 1, 2, 3, 4 在同一个集合中
System.out.println(uf.connected(1, 5)); // 输出 false,因为 5 不在同一个集合中
}
}
代码说明
-
初始化:
-
parent数组用于存储每个节点的父节点,初始时每个节点的父节点是它自己。 -
rank数组用于存储每个节点的秩,初始时每个节点的秩为 1。
-
-
查找操作(
find):- 使用路径压缩技术,使得在查找过程中将访问路径上的每个节点直接指向根节点,从而加速后续查找操作。
-
合并操作(
union):- 使用按秩合并技术,将秩较小的树合并到秩较大的树上,以减少树的高度。
- 如果两棵树的秩相同,则任意选择一棵作为根,并将其秩加 1。
-
连接性检查(
connected):- 检查两个元素是否属于同一个集合,只需比较它们的根节点是否相同。
这种实现方式使得并查集的操作接近于常数时间复杂度,非常适合处理大规模的不相交集合问题。
http://www.zgjzs.org
http://www.shangpin.org
http://www.snjrw.org
http://wangluo.zgjzs.org
http://zhineng.zgjzs.org
http://gaosu.zgjzs.org
http://anquan.zgjzs.org
http://wangzhan.zgjzs.org
http://jiaoyu.zgjzs.org
http://guanggao.zgjzs.org
http://shuju.zgjzs.org
http://zhifu.zgjzs.org
http://yingyong.zgjzs.org
http://yonghu.zgjzs.org
http://houtai.zgjzs.org
http://fenxi.zgjzs.org
http://jiekou.zgjzs.org
http://fenxiang.zgjzs.org
http://neirong.zgjzs.org
http://zhuce.zgjzs.org
http://tongji.zgjzs.org
http://ditu.zgjzs.org
http://tuisong.zgjzs.org
http://gouwu.zgjzs.org
http://tuiguang.zgjzs.org
http://shejiao.zgjzs.org
http://zhongguo.zgjzs.org
http://wangguan.zgjzs.org
http://yule.zgjzs.org
http://pingtai.zgjzs.org
http://jichu.zgjzs.org
http://wangjie.zgjzs.org
http://zhishi.zgjzs.org
http://shangcheng.zgjzs.org
http://dianzi.zgjzs.org
http://yinyue.zgjzs.org
http://tupian.zgjzs.org
http://shipin.zgjzs.org
http://wuliu.zgjzs.org
http://gongju.zgjzs.org
http://anquan.zgjzs.org
http://sousuo.zgjzs.org
http://mima.zgjzs.org
http://jiankong.zgjzs.org
http://ceshi.zgjzs.org
http://wangyou.zgjzs.org
http://zixun.zgjzs.org
http://chajian.zgjzs.org
http://kuaidi.zgjzs.org
http://liuliang.zgjzs.org
http://zhengce.zgjzs.org
http://peizhi.zgjzs.org
http://baocun.zgjzs.org
http://yonghu.shangpin.org
http://houtai.shangpin.org
http://pingtai.shangpin.org
http://wangzhan.shangpin.org
http://zhifu.shangpin.org
http://guanggao.shangpin.org
http://yinyue.shangpin.org
http://zixun.shangpin.org
http://shejiao.shangpin.org
http://tuisong.shangpin.org
http://wangguan.shangpin.org
http://zhineng.shangpin.org
http://wangluo.shangpin.org
http://anquan.shangpin.org
http://zhongguo.shangpin.org
http://shuju.shangpin.org
http://jiekou.shangpin.org
http://zhishi.shangpin.org
http://gongneng.shangpin.org
http://tongji.shangpin.org
http://shipin.shangpin.org
http://jiaoyu.shangpin.org
http://ditu.shangpin.org
http://dianzi.shangpin.org
http://mima.shangpin.org
http://liuliang.shangpin.org
http://gouwu.shangpin.org
http://zhengce.shangpin.org
http://yule.shangpin.org
http://baocun.shangpin.org
http://jichu.shangpin.org
http://fenxi.shangpin.org
http://fenxiang.shangpin.org
http://shangcheng.shangpin.org
http://kuaidi.shangpin.org
http://peizhi.shangpin.org
http://wuliu.shangpin.org
http://ceshi.shangpin.org
http://tupian.shangpin.org
http://wangyou.shangpin.org
http://chajian.shangpin.org
http://tuiguang.shangpin.org
http://yingyong.shangpin.org
http://zhuce.shangpin.org
http://sousuo.shangpin.org
http://jiankong.shangpin.org
http://neirong.shangpin.org
http://gongju.shangpin.org
http://zonghe.shangpin.org
http://zhifu.snjrw.org
http://houtai.snjrw.org
http://yule.snjrw.org
http://wangluo.snjrw.org
http://guanggao.snjrw.org
http://shuju.snjrw.org
http://pingtai.snjrw.org
http://ditu.snjrw.org
http://wangzhan.snjrw.org
http://shejiao.snjrw.org
http://jiekou.snjrw.org
http://zhishi.snjrw.org
http://zhineng.snjrw.org
http://jiaoyu.snjrw.org
http://zhongguo.snjrw.org
http://yinyue.snjrw.org
http://yonghu.snjrw.org
http://tuiguang.snjrw.org
http://gouwu.snjrw.org
http://baocun.snjrw.org
http://fenxiang.snjrw.org
http://fenxi.snjrw.org
http://gongneng.snjrw.org
http://wangguan.snjrw.org
http://zixun.snjrw.org
http://dianzi.snjrw.org
http://tupian.snjrw.org
http://wangyou.snjrw.org
http://chajian.snjrw.org
http://wuliu.snjrw.org
http://mima.snjrw.org
http://liuliang.snjrw.org
http://zhuce.snjrw.org
http://zhengce.snjrw.org
http://peizhi.snjrw.org
http://shipin.snjrw.org
http://jichu.snjrw.org
http://tongji.snjrw.org
http://kuaidi.snjrw.org
http://yingyong.snjrw.org
http://sousuo.snjrw.org
http://jiankong.snjrw.org
http://neirong.snjrw.org
http://gongju.snjrw.org
http://tuisong.snjrw.org
http://shangcheng.snjrw.org
http://anli.snjrw.org
http://dianhua.snjrw.org
http://fuwu.snjrw.org