java实现并查集算法

本文介绍了一种用于处理不相交集合合并及查询问题的数据结构——并查集,并详细讲解了其实现原理与优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

并查集

并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并。

主要作用

解决连接问题

如何在上图这样复杂的图中判断两个点是否是相连的,这就是并查集要解决的

类UnionFind

parent[]存储该节点的父亲节点
public class UnionFind {
	private int[] parent;
	private int count;
	private int[] rank;  //rank[i]表示以i为根的集合所表示的树的层数
	
	public UnionFind(int n) {

		this.parent =new int[n];
		this.rank=new int[n];
		this.count = n;
		for(int i=0;i<n;i++){
			parent[i]=i;
			rank[i]=1;
		}
	}
	
	//查找p的根节点
	public int find(int p){
		assert(p>=0&&p<count);
//		while(p!=parent[p]){
//			parent[p]=parent[parent[p]];     //路径压缩优化
//			p=parent[p];
//		}
//		return p;
		
		
		if(p!=parent[p])
			parent[p]=find(parent[p]);	//更优化的路径压缩
		return parent[p];	
		
	}
	//若p,q的根节点相同则表明他们连接
	public boolean isConnected(int p,int q){
		return find(p)==find(q);
	}
	//合并
	public void unionElements(int p,int q){
		int pRoot=find(p);
		int qRoot=find(q);
		if(pRoot==qRoot)
			return;
		if(rank[pRoot]<rank[qRoot]){
			parent[pRoot]=qRoot;    //rank[qRoot]不用更新
		}else if(rank[qRoot]<rank[qRoot]){
			parent[qRoot]=pRoot;
		}else{
			parent[pRoot]=qRoot;
			rank[qRoot]+=1;
		}
		
	}


}


更优化的路径压缩将一棵树压缩成只有两层,所有子节点只有一个根节点,这样在查找根节点或合并时能更快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值