您的位置:首页 > 其它

并查集路径压缩

2014-02-22 14:57 155 查看
之前在博客上写过一篇并查集的文章,当时并没有用到路径压缩,效率较低,今天做到一道题发现使用朴素的并查集方案超时了,之后改用路径压缩通过了;因此在这里再讨论下使用路径压缩的并查集。

这是最朴素的并查集代码:

int find(int r)
{
while(r!=bin[r])
{
r=bin[r];
}
return r;
}
这是使用了路径压缩的代码:
int find(int r)
{
if(r!=bin[r])
{
bin[r]=find(bin[r]);
}
return bin[r];
}

由于使用了递归方式来查找,数量级比较大的时候可能会出现栈溢出,所以还是会出现问题。
下面给出非递归的方式:

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