并查集是非常简单并且非常实用的一种高级数据结构,在很多查找程序中都是用的并查集。
其实可以这样来理解并查集 , 把并查集看成是有很多棵树组成的 , 也就是森林 , 只不过是用数组而不是链表来实现的 。
下面是最近的简单的并查集:
find ( int x)
{
while( x != p[x])
x = p[x] ;
return x;
}
这个代码是很简洁 , 但有时候如果数据量过大 , 那就太慢了;
这个是用递归实现的路径压缩
find (int x)
{
if(p[x] != x)
p[x] = find(p[x]);
return x;
}
但是,递归压缩路径可能会造成溢出栈,我曾经因为这个RE了n次,下面说一下非递归方式进行的路径压缩:
int find (int x)
{
int t = x;
while( p[x] != x)
x = p[x];
while( t != x)
{
int j = p[t] ;
p[t] = x;
t = j;
}
return x;
}
其实可以这样来理解并查集 , 把并查集看成是有很多棵树组成的 , 也就是森林 , 只不过是用数组而不是链表来实现的 。
下面是最近的简单的并查集:
find ( int x)
{
}
这个代码是很简洁 , 但有时候如果数据量过大 , 那就太慢了;
这个是用递归实现的路径压缩
find (int x)
{
}
但是,递归压缩路径可能会造成溢出栈,我曾经因为这个RE了n次,下面说一下非递归方式进行的路径压缩:
int find (int x)
{
}