并查集基础

本文介绍了并查集这一数据结构及其在计算机科学中的应用。并查集主要用于处理不相交集合的合并与查询问题,文章详细解释了两种优化方法:路径压缩与按秩合并,并提供了具体的代码实现。

 内容摘自维基百科

在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。有一个联合-查找算法union-find algorithm)定义了两个操作用于此数据结构:

  • Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。
  • Union:将两个子集合并成同一个集合。

并查集的两种优化方法:路径压缩与按秩合并:

第一种方法,称为“按秩合并”,即总是将更小的树连接至更大的树上。因为影响运行时间的是树的深度,更小的树添加到更深的树的根上将不会增加秩除非它们的秩相同。在这个算法中,术语“秩”替代了“深度”,因为同时应用了路径压缩时(见下文)秩将不会与高度相同。单元素的树的秩定义为0,当两棵秩同为r的树联合时,它们的秩r+1。只使用这个方法将使最坏的运行时间提高至每个MakeSet、Union或Find操作O(\log n)

第二个优化,称为“路径压缩”,是一种在执行“查找”时扁平化树结构的方法。关键在于在路径上的每个节点都可以直接连接到根上;他们都有同样的表示方法。为了达到这样的效果,Find递归地经过树,改变每一个节点的引用到根节点。得到的树将更加扁平,为以后直接或者间接引用节点的操作加速。

 

int root[N],Rank[N];
void Init(){
    for(int i = 0; i < N; i++){
        root[i] = i;
        Rank[i] = 1;
    }
}
int Find(int v){       ///带路径压缩的递归找根节点
    if(root[v] != v)
        root[v] = Find(root[v]);
    return root[v];
}
void Union(int x, int y){   /// 普通合并操作
    int fx = Find(x);
    int fy = Find(y);
    if(fx != fy)
        root[fx] = fy;
}

void Weight_Union(int x, int y){///按秩合并,元素少的集合根节点指向元素多的集合的根节点;
    x = Find(x);
    y = Find(y);
    if(x == y) return ;
    if(Rank[x] >= Rank[y]){
        root[y] = x;
        Rank[x] += Rank[y];
    }else{
        root[x] = y;
        Rank[y] += Rank[x];
    }
    //cout<<x<<"\t"<<y<<"\t"<<Rank[x]<<"\t"<<Rank[y]<<endl;
}

 

 练习题目:

poj 1611:水题,敲完模板就能过;

 poj 2524:水题。

转载于:https://www.cnblogs.com/yoyo-sincerely/p/5191433.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值