如何写一个并查集结构,支持合并、查找集合

并查集(Union-Find)是一种用于处理不相交集合(disjoint sets)合并及查询问题的数据结构。它支持两种主要操作: find(查找)用于确定元素所属的集合, union(合并)用于合并两个集合。下面是一个简单的 Python 实现的并查集结构:

pythonCopy Codeclass UnionFind:    def __init__(self, size):        # 初始化时,每个节点的父节点指向自己,rank用于优化合并
        self.parent = [i for i in range(size)]
        self.rank = [1] * size    def find(self, p):        # 路径压缩:不断将当前节点的父节点更新为其祖先节点,直到找到根节点
        if self.parent[p] != p:
            self.parent[p] = self.find(self.parent[p])  # 递归路径压缩
        return self.parent[p]    def union(self, p, q):        # 连接两个节点,先找到两个节点的根
        rootP = self.find(p)
        rootQ = self.find(q)        # 如果根相同,说明已经在同一集合中
        if rootP == rootQ:            return
        # 按秩合并:将较低的树连接到较高的树上
        if self.rank[rootP] < self.rank[rootQ]:
            self.parent[rootP] = rootQ        elif self.rank[rootP] > self.rank[rootQ]:
            self.parent[rootQ] = rootP        else:
            self.parent[rootQ] = rootP
            self.rank[rootP] += 1
    def connected(self, p, q):        # 检查两个节点是否属于同一集合
        return self.find(p) == self.find(q)# 示例用法uf = UnionFind(10)
uf.union(1, 2)
uf.union(3, 4)
uf.union(2, 4)print(uf.connected(1, 4))  # 输出 True,因为 1, 2, 3, 4 都在同一集合print(uf.connected(1, 5))  # 输出 False,因为 5 不在同一集合

代码说明:

  1. 初始化‌:

    • parent 数组用于记录每个节点的父节点,初始时每个节点的父节点是它自己。
    • rank 数组用于记录每个集合树的高度,初始时每个节点所在的集合树高度为 1。
  2. find 方法‌:

    • 使用路径压缩技术,使得树的高度大大降低,从而加速后续的查找操作。
  3. union 方法‌:

    • 通过比较两棵树的秩(高度)来决定如何合并,尽量保持树的高度最小。
  4. connected 方法‌:

    • 用于检查两个节点是否属于同一集合。

这种实现通过路径压缩和按秩合并,使得单次操作的时间复杂度接近于常数时间,非常高效。


http://xuexiao.zgjzs.org

http://jianzhu.zgjzs.org

http://gongcheng.zgjzs.org

http://sheji.zgjzs.org

http://fangwu.zgjzs.org

http://jiaoyu.zgjzs.org

http://kejian.zgjzs.org

http://chengshi.zgjzs.org

http://guihua.zgjzs.org

http://jiaju.zgjzs.org

http://jianli.zgjzs.org

http://zhucai.zgjzs.org

http://jichu.zgjzs.org

http://gaosu.zgjzs.org

http://ditu.zgjzs.org

http://lvyou.zgjzs.org

http://zhishi.zgjzs.org

http://shipin.zgjzs.org

http://peixun.zgjzs.org

http://wenhua.zgjzs.org

http://gongsi.zgjzs.org

http://renwu.zgjzs.org

http://xinwen.zgjzs.org

http://zixun.zgjzs.org

http://anli.zgjzs.org

http://guwen.zgjzs.org

http://zhaopin.zgjzs.org

http://yingxiao.zgjzs.org

http://guanli.zgjzs.org

http://peitao.zgjzs.org

http://jixie.zgjzs.org

http://zhuangxiu.zgjzs.org

http://anquan.zgjzs.org

http://chengguo.zgjzs.org

http://baogao.zgjzs.org

http://chengjiu.zgjzs.org

http://zhanshi.zgjzs.org

http://huodong.zgjzs.org

http://huiyi.zgjzs.org

http://tongji.zgjzs.org

http://jiaoliu.zgjzs.org

http://keti.zgjzs.org

http://jingcai.zgjzs.org

http://tuandui.zgjzs.org

http://jingying.zgjzs.org

http://wenjian.zgjzs.org

http://baoming.zgjzs.org

http://wangzhan.zgjzs.org

http://xiazai.zgjzs.org

http://chengxin.zgjzs.org

http://nanzhuang.shangpin.org

http://xiezi.shangpin.org

http://baozi.shangpin.org

http://yundong.shangpin.org

http://shuma.shangpin.org

http://diannao.shangpin.org

http://shouji.shangpin.org

http://jiajv.shangpin.org

http://canju.shangpin.org

http://muying.shangpin.org

http://shipin.shangpin.org

http://jiushui.shangpin.org

http://jiafang.shangpin.org

http://shouna.shangpin.org

http://meishi.shangpin.org

http://lingshi.shangpin.org

http://chufang.shangpin.org

http://jianshen.shangpin.org

http://qiche.shangpin.org

http://yundongyi.shangpin.org

http://bangong.shangpin.org

http://wenju.shangpin.org

http://shuben.shangpin.org

http://dianqi.shangpin.org

http://jiadian.shangpin.org

http://fanghuo.shangpin.org

http://fangshui.shangpin.org

http://fangdao.shangpin.org

http://muyuan.shangpin.org

http://fengshui.shangpin.org

http://zhuangxiu.shangpin.org

http://gongju.shangpin.org

http://chaju.shangpin.org

http://weisheng.shangpin.org

http://xiangbao.shangpin.org

http://yanjing.shangpin.org

http://shoubiao.shangpin.org

http://shipinbao.shangpin.org

http://jiazhuang.shangpin.org

http://chuanglian.shangpin.org

http://yundongxie.shangpin.org

http://tiyu.shangpin.org

http://luyou.shangpin.org

http://jiejing.shangpin.org

http://shumaerji.shangpin.org

http://chejian.shangpin.org

http://xihu.shangpin.org

http://zhizao.shangpin.org

http://cheshen.shangpin.org

http://zhinen.shangpin.org

http://xinwen.snjrw.org

http://zixun.snjrw.org

http://keji.snjrw.org

http://jiaoyu.snjrw.org

http://renwu.snjrw.org

http://wenhua.snjrw.org

http://lishi.snjrw.org

http://jingji.snjrw.org

http://caijing.snjrw.org

http://jinrong.snjrw.org

http://touzi.snjrw.org

http://fangchan.snjrw.org

http://chanye.snjrw.org

http://gongye.snjrw.org

http://qiche.snjrw.org

http://shuma.snjrw.org

http://yule.snjrw.org

http://dianying.snjrw.org

http://yinyue.snjrw.org

http://meiti.snjrw.org

http://hulianwang.snjrw.org

http://chuangye.snjrw.org

http://gongsi.snjrw.org

http://baike.snjrw.org

http://zhishi.snjrw.org

http://wenxue.snjrw.org

http://yishu.snjrw.org

http://zhanlan.snjrw.org

http://huodong.snjrw.org

http://jiaoliu.snjrw.org

http://keti.snjrw.org

http://xueshu.snjrw.org

http://wenjian.snjrw.org

http://baogao.snjrw.org

http://shuju.snjrw.org

http://diaocha.snjrw.org

http://mingren.snjrw.org

http://jiemu.snjrw.org

http://shipin.snjrw.org

http://zhuanlan.snjrw.org

http://zhuanti.snjrw.org

http://wangzhan.snjrw.org

http://wangluo.snjrw.org

http://zhanzhang.snjrw.org

http://shichang.snjrw.org

http://guanli.snjrw.org

http://anquan.snjrw.org

http://jishu.snjrw.org

http://xiazai.snjrw.org

http://wenzhang.snjrw.org

请使用浏览器的分享功能分享到微信等