并查集的故事

15 篇文章 0 订阅
6 篇文章 0 订阅

并查集:

  1. : 查找x属于哪个集合,如果x属于某一个集合,则返回该集合的代表。

  2. :如果元素  与元素  ,分别属于不同的集合,则将两个集合合并,否则不操作。

并查集基础操作:初始化

WJU7wV.png

void makeSet(int n){
	for(int i=1;i<=n;i++) dad[i]=i;
}

并查集基础操作:合并

只需要将每个集合的代表进行链接即可

void unionSet(int x,int y){
	dad[findSet(x)]=findSet(y);
}

并查集基础操作:查询

WJU2FS.png

int findSet(x){
	if(dad[x]==x) return x;
   	else return findSet(dad[x]);
}

并查集查询优化 : 路径压缩

其实就是因为一个父节点他后面的儿子是很长的(大概),所以就把他弄成一排,这样深度就没有那么深,查询起来就很快

WJN5VK.png

int findSet(x){
	if(dad[x]==x) return x;
   	else return dad[x]=findSet(dad[x]);
}

并查集合并优化:按秩合并

就是也是把深度压缩,就是比如有两颗树,没必要把一棵树放在另一颗树的上面。

看下面这个图:

WJYrLV.png

那个8如果这样放:

WJt8p9.png

其实就很没必要,所以把那个8放在下面:

就像这样:

WJNV4e.png

你会发现深度就变少了,虽然优化了一点,但是还是没优化多少,把路径压缩这个记住就行

另附干货:

WJ3QBD.jpgWJ3EN9.jpgWJ3ujK.jpgWJ3m1x.jpgWJ3AAJ.jpgWJ3lHe.jpgWJ3G4A.jpgWJ3t3t.jpgWJ3Ujf.jpgWJ30Hg.jpgWJ3wDS.jpg

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值