您的位置:首页 > 其它

并查集的路径压缩算法

2015-07-21 11:54 232 查看
使用并查集查找时,如果查找次数很多,那么使用朴素版的查找方式肯定要超时。比如,有一百万个元素,每次都从第一百万个开始找,这样一次运算就是10^6,如果程序要求查找个一千万次,这样下来就是10^13,肯定要出问题的。

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

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


下面是采用路径压缩的方法查找元素:

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


上面是一采用递归的方式压缩路径, 但是,递归压缩路径可能会造成溢出栈,我曾经因为这个RE了n次,下面我们说一下非递归方式进行的路径压缩:

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;         //返回根节点的值
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: