并查集(Union-Find Set)介绍

并查集(Union-Find)深度解析:从基础实现到工业级优化

并查集核心要义

定义:处理不相交集合的高效数据结构
核心操作

  • Find - 查询元素所属集合根节点
  • Union - 合并两个集合
  • Connected - 判断两元素是否连通

应用场景

  • 社交网络好友关系分析
  • Kruskal最小生成树算法
  • 图像连通区域标记
  • 棋盘游戏连通性判断

一、基础实现与复杂度分析

初始版本代码实现(C++)

#include <vector>
using namespace std;

class UnionFind {
   
   
private:
    vector<int> parent;
public:
    UnionFind(int size) : parent(size, -1) {
   
   } // 初始化所有节点为独立集合

    // 基础Find操作
    int find(int x) {
   
   
        while (parent[x] >= 0) {
   
   
            x = parent[x];
        }
        return x;
    }

    // 基础Union操作
    void unionSets(int root1, int root2) {
   
   
        if (root1 == root2) return;
        parent[root2] = root1;
    }

    // 连通性判断
    bool connected(int x, int y) {
   
   
        return find(x) == find(y);
    }
};

复杂度对比表

操作 时间复杂度 空间复杂度
基础Find O(h) → O(n) O(n)
基础Union O(1) O(n)
连通性判断 O(h) → O(n) O(n)

h为树的高度,最坏情况下退化为链表结构


二、工业级优化策略

1. 路径压缩(Path Compression)

优化原理:将查询路径上的节点直接连接到根节点,摊平树结构

// 路径压缩优化版Find
int find(int x) {
   
   
    if (parent[x] < 0) return x;
    return parent
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

star _chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值