并查集之 Find函数

  • Post author:
  • Post category:其他



发现自己写了两道题都把Find函数写得一塌糊涂。。。一题是没有路径压缩过不了,一题是因为前面写错过弄混了,不三不四的。。。总结很重要啊!!


路径压缩:递归写法:


int Find (int x)


{


if(Father[x] != x)


{


Father[x] = Find(Father[x]);//原来写成Father[x] = Father[Father[x]]了。。 //不断地找到其根节点并更改其值


}


return Father[x];


}


非递归写法:


int Find(int x)


{


if(Father[x] != x)


{


Father[x] = Father[Father[x]];// 将p节点的父节点设置为它的爷爷节点 ,而自己设置为它的父节点 x = Father[x];


}


return x;


}


一般写法:


非递归递归:


int Find (int x)


{


// 寻找p节点所在组的根节点,根节点具有性质Father[root] = root


if(Father[x] != x)


{


x = Father[x] ;//把它的父节点的值找到赋给它,直到Father[root] = root


}


return x;//


}


递归写法:


int Find(int x)


{


if(a[x]!= x)//符合Father[x] = x的,x就是根节点,不是的就找到根节点返回。


{


return Find(a[x]);


}


return x;


}


总结:所谓的路径压缩,就是把根节点下面的所有子孙直接与根节点相连,这样搜索时搜索深度为1,而一般的写法只是把当前结点与它的父节点直接相连,那么搜索深度就>1了,时间就长了。要知道是不是路径压缩(有时我会弄混),只要看是不是把它的父节点设置为它的爷爷结点就行了。只针对个人总结。



版权声明:本文为wan1314mum原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。