查集讲解(按秩合并与路径压缩)

本文介绍了并查集的两种优化方法:路径压缩和按秩合并。通过这两种方法能够有效减少查询时间,提高并查集效率。文章详细展示了如何实现这些优化,并解释了背后的原理。

自看。。。

借鉴自:https://blog.youkuaiyun.com/u011056504/article/details/51222494

1、路径压缩

void find(int x)
{
    return f[x] == x ? x : (f[x] = find(f[x]));
}

2、按秩合并

给每个点一个秩,其实就是树高 
每次合并的时候都用秩小的指向秩大的,可以保证树高最高为log2(n)log2(n) 
操作的时候,一开始所有点的秩都为1 
在一次合并后,假设是点x和点y,x的秩小 
当然x和y都是原来x和y所在区间的顶点 
设点x秩为rank[x] 
将fa[x]指向y,然后将rank[y]的与rank[x+1]取max 
因为rank[x]为区间x的高,将它连向y之后,y的树高就会是x的树高+1,当然也可能y在另一边树高更高,所以取max

程序

同样,fa[x]为x的父亲,就是x指向的点,rank[x]为点x的秩

 

//查询:
void find(int x)
{
    return f[x] == x ? x : find(f[x]);
}

//修改:
    
    int r = find(x);
    int l = find(y);
    if(r == l) continue;
    if(rank[l] <= rank[r]) f[l] = r, rank[r] = max(rank[r], rank[l] + 1);
    else f[r] = l, rank[l] = max(rank[l], rank[r] + 1);

 

转载于:https://www.cnblogs.com/WTSRUVF/p/9416217.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值