并查集及其路径的压缩

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

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

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值