并查集及其路径的压缩

并查集是非常简单并且非常实用的一种高级数据结构,在很多查找程序中都是用的并查集。
其实可以这样来理解并查集 , 把并查集看成是有很多棵树组成的 , 也就是森林 , 只不过是用数组而不是链表来实现的 。

下面是最近的简单的并查集:

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;
}

你可能感兴趣的:(并查集训练)