并查集的优化:按秩合并和路径压缩

转载 2016年08月31日 14:32:06

转载于:http://www.tuicool.com/articles/Zb2qYzj

并查集有两个优化。

一、按秩合并

描述:就是在对两个不同子集连接时,按照rank来连,也就是rank低的连在rank高的下面。rank高的做父亲节点。

作用,这样类似维护了一棵树,树是rank高的在上。

// 初始化n个元素
void init(int n)
{
    for(int i=0;i<n;i++)
    {
        parent[i]=i;
        rank[i]=0;   // 初始树的高度为0
    }
}


// 合并x和y所属的集合
void unite(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y) return ;
    if(rank[x]<rank[y])
        parent[x]=y;  // 合并是从rank小的向rank大的连边
    else
    {
        parent[y]=x;
        if(rank[x]==rank[y]) rank[x]++;
    }
}

二、路径压缩

描述:假如fa数组已经嵌套了N层,那么传统的做法去找祖先要做N次,当N很大时,这种做法很没效率。

这是朴素查找的代码,适合数据量不大的情况

int findx(int x)
{
    int r=x;
   while(parent[r] !=r)
        r=parent[r];
   return r;
}

    下面是采用递归路径压缩的方法查找元素,但是,递归压缩路径可能会造成溢出栈会发生RE

int find(int x)       //查找x元素所在的集合,回溯时压缩路径
{
    if (x != parent[x])
    {
        parent[x] = find(parent[x]);     //回溯时的压缩路径
    }         //从x结点搜索到祖先结点所经过的结点都指向该祖先结点
    return parent[x];
}

下面我们说一下非递归方式进行的路径压缩

int find(int x)
{
    int k, j, r;
    r = x;
    while(r != parent[r])     //查找跟节点
        r = parent[r];      //找到跟节点,用r记录下
    k = x;        
    while(k != r)             //非递归路径压缩操作
    {
        j = parent[k];         //用j暂存parent[k]的父节点
        parent[k] = r;        //parent[x]指向跟节点
        k = j;                    //k移到父节点
    }
    return r;         //返回根节点的值            
}

相关文章推荐

UVA 11354 - Bond(并查集-按秩合并)

题目链接:点击打开链接 题意:给出一张n个点m条边的无向图, 每条边有一个危险度,有q个询问, 每次给出两个点s、t,找一条路, 使得路径上的最大危险度最小。 思路:首先,我们可以发现,如果求一个...

并查集-按秩合并

1239: 中山学院 ACM小组 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 79  Solved: 21 [Submit][Status][W...

并查集(两个优化—按秩合并、路径压缩) poj2492

并查集有两个优化。 一、按秩合并 描述:就是在对两个不同子集连接时,按照rank来连,也就是rank低的连在rank高的下面。rank高的做父亲节点。 作用,这样类似维护了一棵树,树是rank高...

JZOJ4769 【GDOI2017模拟9.9】graph CDQ分治+用按秩合并维护带撤销的并查集(BZOJ 4025)

题目大意现在有NN个点,MM个操作,对于每个操作有两种情况 1. Ord=1Ord = 1:读入u,vu,v表示连接u,vu,v。 2. Ord=0Ord = 0:读入uu表示删除第uu次连接的边...

并查集(按秩合并、路径压缩)

算法分类: 数据结构 算法原理: 通过find函数找出该节点的根节点, 通过UNION函数将两棵树合并。 加入rank[N]来记录每个节点的秩(即树的高度),并按秩进行合并,可避免合...

【模版】并查集 及路径压缩

Ps:在网上看到的写的很好的并查集

【转】并查集路径压缩

使用并查集查找时,如果查找次数很多,那么使用朴素版的查找方式肯定要超时。比如,有一百万个元素,每次都从第一百万个开始找,这样一次运算就是10^6,如果程序要求查找个一千万次,这样下来就是10^13,肯...
  • sysucph
  • sysucph
  • 2012年02月16日 00:47
  • 11292

并查集的两个优化(秩优化+路径压缩)

路径压缩 寻找祖先时采用递归,但是一旦元素一多起来,或退化成一条链,每次GetFather都将会使用O(n)的复杂度,这显然不是我们想要的。对此,我们必须要进行路径压缩,即我们找到最久远...

并查集的“并优化”(leader合并)和“查优化”(路径压缩)

在博文http://blog.csdn.net/stpeace/article/details/46506861中, 我们已经详细地了解了并查集, 不过, 那个程序略显粗糙, 下面我们考虑来优化一下。...
  • stpeace
  • stpeace
  • 2015年06月22日 16:45
  • 1400

POJ 1988 Cube Stacking(路径压缩并查集)

POJ 1988 Cube Stacking(路径压缩并查集) 分析:主要就是并查集路径压缩,如果M a b就等于把a所属的连通分量连接到b所属的连通分量上 每个节点维护3个变量:其与父节点之间有多少...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:并查集的优化:按秩合并和路径压缩
举报原因:
原因补充:

(最多只允许输入30个字)