Disjoint-set data structure

并查集

优化一:优化查找(get)
查找的优化是路径压缩,大大提高了优化效率

我们可以看到,我们每次get一个x,它都会遍历它的父节点,若我们重复get,则他会重复遍历,这大大降低了效率。

如果我们可以在他返回的时候将他路径上的每个节点的父节点全部改为根节点,则下一次查找时,可不用再次逐一查询。

优化二:优化合并(marge)
合并的优化方式是按秩合并,这种优化可以忽略,不去使用它。 在数据量非常大,且数据***钻时,可考虑加上这个优化,否则,优化一 足矣

1、优化方法是创建一个h[]数组维护每个集合树的深度。

2、在marge时,将深度小的树作为深度大的的儿子, 最后树的总深度仍是最大的那个深度,这样,在find时,会提高效率。

3、若两颗树的深度相同,则谁做谁的儿子都可以,只需将其深度加一即可

namespace _union
{
    int rank[N], pre[N];
    
    
    inline void init ()
    {
        for (int i = 1;i <= n;i ++ )
        {
            pre[i] = i;
            rank[i] = 1;
        }
    }
    
    //路径压缩
    inline int find (int x)
    {
        return pre[x] == x ? x : pre[x] = find (pre[x]);
    }

    //按秩合并
    inline void merge (int x, int y)
    {
        int px = find (x), py = find (y);
        
        if (px == py) return ;
        
        if (rank[px] > rank[py])
        {
            pre[py] = px;
        }
        ef (rank[py] > rank[px])
        {
            pre[px] = py;
        }
        else
        {
            pre[py] = px;
            rank[px] ++ ;
        }
    }
}
posted @ 2024-10-25 18:50  矢日影一死  阅读(8)  评论(0)    收藏  举报
您的浏览器不兼容canvas