首页 > 其他 > 详细

再学并查集

时间:2019-01-03 20:31:55      阅读:135      评论:0      收藏:0      [点我收藏+]

并查集好啊!

虽然并查集很好,但是我对它的掌握却十分肤浅。
搬运算导
1.单用路径压缩复杂度\(O(n+m*(1+log_{2+m/n}n))\)
证明是不可能有的。
2.单用按秩合并并且记忆化复杂度\(O(nlogn+m)\)
由于路径压缩也是一种记忆化,所以混合策略也有该上界。
复杂度显然。
3.假设所有\(link\)在所有\(find\)前,复杂度\(O(m)\),只使用路径压缩或使用混合策略。势能分析一下。
4.众所周知,\(\alpha(n)=min \{ k:A_{k}(1) \ge n \}\)
可得上界\(O(m \alpha(n))\)
\(\alpha^{'}(n)=min \{ k:A_{k}(1) \ge lg(n+1) \}\)
使用混合策略时,可得到上界\(O(m \alpha{'}(n))\)
对于\(n\)的所有实际值,\(\alpha^{'}(n) \le 3\)
证明是不可能有的。
总之,跑得挺快。
贴代码

struct dsu{
    int fa[N];
    void init(int len){
        memset(fa,-1,sizeof(*fa)*(len+1));
    }
    int find(int x){
        return fa[x]<0?x:find(fa[x]);
    }
    int unite(int x,int y){
        x=find(x);
        y=find(y);
        if (fa[x]<fa[y]){
            fa[x]+=fa[y];
            fa[y]=x;
        }
        else{
            fa[y]+=fa[x];
            fa[x]=y;
        }
    }
};

递归写法好啊!

再学并查集

原文:https://www.cnblogs.com/Yuhuger/p/10216659.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!