【并查集】union和find的几种实现

本文深入探讨并查集数据结构,包括快速查找(quick-find)、快速联合(quick-union)及其优化策略——加权快速联合与路径压缩。通过分析不同实现方式的时间复杂度,阐述如何有效避免最差情况,提升算法性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


书接上回 union-find算法(并查集),先抛开上文中的 unionfind实现方式不谈。
并查集中, unionfind有以下几种实现方式:
(1) quick-findfind()的时间复杂度是 O(1)union()的是 O(n)
(2) quick-unionfind()的时间复杂度是 O(n)union()的是 O(1)
(3) 加权 quick-union:优化 quick-unionfind()
(4) 路径压缩的加权 quick-union:优化加权 quick-unionfind()

以上指的是单次操作的时间复杂度是,且union里调用find所用的时间不算。

quick-find

保证当且仅当id[p]等于id[q]pq是连通的,即同一连通分量中所有触点在数组中的值全部相同
比如有以下两个连通分量,标识符分别为96
触点3849属于分量9
触点501726属于分量6
在这里插入图片描述

实现

union_find.h

#ifndef UNION_FIND
#define UNION_FIND

#include <vector>

class UF {
   
public:
    UF(size_t N);
    ~UF();

    size_t Count() const;
    void Union1(size_t p, size_t q);
    size_t Find1(size_t p) const;

private:
    std::vector<size_t> id;
    size_t count_;
};

#endif

union_find.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值