根据几天来的做题时候遇到的问题来看,并查集查找有两种一种适合数据量小的时候,但是,当数据量很大的时候将会超时。所以,还有一种查找的方式。
数据量小的时候。
int findx(int x)
{
int r=x;
if(arr[r]!=r)
r=arr[r;
return r;
}
数据量大的时候。
int findx(int x) //查找x元素所在的集合,回溯时压缩路径
{
if (x != arr[x])
{
arr[x] = findx(arrt[x]); //回溯时的压缩路径
} //从x结点搜索到祖先结点所经过的结点都指向该祖先结点
return arr[x];
}
上面是一种递归的的方式压缩路径。但是有时候会造成栈的溢出,下面我介绍一种不是递归方式的压缩路径
int findx(int x)
{
int k, j, r;
r = x;
while(r != arr[r]) //查找跟节点
r = arr[r]; //找到跟节点,用r记录下
k = x;
while(k != r) //非递归路径压缩操作
{
j = arr[k]; //用j暂存parent[k]的父节点
arr[k] = r; //parent[x]指向跟节点
k = j; //k移到父节点
}
return r; //返回根节点的值
}