新闻中心

C++怎么实现一个并查集_C++数据结构中Disjoint Set Union的路径压缩与按秩合并

2025-11-21
浏览次数:
返回列表
并查集通过路径压缩和按秩合并优化,显著提升操作效率。1. 初始化每个元素父节点为自身,秩为0;2. 查找时递归压缩路径,使节点直连根;3. 合并时按秩挂载,小秩并入大秩,相等则任选根并增秩。此结构支持高效集合查询与合并,平均时间接近常数。

c++怎么实现一个并查集_c++数据结构中disjoint set union的路径压缩与按秩合并

在C++中实现并查集(Disjoint Set Union, DSU)时,路径压缩和按秩合并是两个关键优化技术,它们能显著提升查找与合并操作的效率,使平均时间复杂度接近常数级别。

基本结构设计

并查集用于维护一组元素的划分,支持快速查找某个元素所属集合以及合并两个集合。核心是用数组存储每个节点的父节点。

初始化时,每个元素的父节点指向自己,表示独立集合。可以用一个vector保存parent信息,另一个记录每个集合的秩(rank),用于按秩合并。

示例结构:

vector parent; // 父节点索引 vector rank; // 树的高度上界

路径压缩(Path Compression)

在查找根节点的过程中,把沿途的所有节点直接连接到根,从而压平树结构。这样后续查找会更快。

查找函数使用递归实现路径压缩非常简洁:

  • 如果当前节点不是根(parent[x] != x),则递归查找根,并将parent[x]更新为返回值
  • 最终返回根节点

这一操作让整条路径上的节点都指向根,极大减少未来查找深度。

代码片段:

int find(int x) {
  if (parent[x] != x)
    parent[x] = find(parent[x]);
  return parent[x];
}

按秩合并(Union by Rank)

合并两个集合时,通过比较两棵树的秩决定挂载方向:将秩较小的树根连到秩较大的树根下。若秩相等,则任选一方作为新根,并将其秩加一。

CA.LA CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 94 查看详情 CA.LA

这样做可以避免生成过深的树,控制整体高度。

  • 找到两个元素的根
  • 比较对应秩的大小
  • 小秩向大秩合并
  • 相同秩时更新新根的秩
合并逻辑:

void unite(int x, int y) {
  int rx = find(x), ry = find(y);
  if (rx == ry) return;
  if (rank[rx]     parent[rx] = ry;
  else if (rank[rx] > rank[ry])
    parent[ry] = rx;
  else {
    parent[ry] = rx;
    ++rank[rx];
  }
}

完整实现示例

封装成类更便于管理。构造函数初始化每个节点为独立集合。

假设处理n个编号从0到n-1的元素:

struct DSU {
  vector parent, rank;
  DSU(int n) {
    parent.resize(n);
    rank.resize(n, 0);
    for (int i = 0; i   }
  int find(int x) { ... }
  void unite(int x, int y) { ... }
};

这个结构可在Kruskal算法、连通分量判断等场景中高效使用。

基本上就这些。路径压缩配合按秩合并,使得DSU的操作几乎是常数时间,适合大规模数据处理。注意两者结合效果最佳,单独使用任一优化也能带来明显提升。

以上就是C++怎么实现一个并查集_C++数据结构中Disjoint Set Union的路径压缩与按秩合并的详细内容,更多请关注其它相关文章!


# 这一  # 贝因美积分网站建设工作  # 昌乐网站优化方式推广  # seo步骤  # 安阳市网站推广工具优化  # 汕头早教类推广招聘网站  # 黄冈短视频矩阵营销推广方案  # 淄博网站建设和制作公司  # 陕西百度知识营销推广招聘  # 银行线上营销推广文案  # 丽水出名seo优化软件  # c++  # 新新  # 配置文件  # 多线程  # 解决方法  # 怎么做  # 重写  # 有什么  # 数据结构  # 递归 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Django表单验证失败时保留用户输入数据的最佳实践  Node.js中HTML按钮与J*aScript函数交互的正确姿势  内存疯狂猛猛涨价:主板销量直接腰斩!  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  必由学官网首页入口 必由学教师网页版登录指南  我的世界官方游戏入口 我的世界官网平台直达链接  excel怎么制作工资条 excel快速生成工资条的方法  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法  steam官方网页快速访问 steam账号注册全流程  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  如何在网页中实现特定地点的随机图片展示  steam官方入口大全 steam账号注册及操作指南  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  如何有效阻止外部脚本意外修改内联样式的高度属性  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  qq游戏手机版下载安装_qq游戏移动端入口  J*a递归快速排序中静态变量的状态管理与陷阱  css绝对定位元素脱离父容器怎么办_确保父元素position非static  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  css滚动动画效果怎么实现_使用Animate.css滚动触发动画类  必由学登录入口 必由学官方网站在线访问链接  处理嵌套交互式控件:前端可访问性指南  Shopware订单对象中获取产品自定义字段的正确方法  mysql如何设置表访问权限_mysql表访问权限配置  163邮箱官方主页登录 直达网易邮箱登录核心页面  Pyrogram与g4f集成:异步编程实践与常见错误解决  怎么在mac上运行html代码_mac运行html代码方法【指南】  WordPress插件开发:正确注册卸载钩子与避免常见陷阱  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  在哪找SublimeJ远程工具_SFTP插件配置教程  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  C++指针和引用有什么区别_C++内存管理核心概念深度解析  mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤  AO3访问入口汇总 AO3网页版同人作品一键直达  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  抖音创作助手登录入口_抖音创作辅助工具官网直达  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  c++中为什么推荐使用using替代typedef_c++现代化类型别名  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  免费抖音短视频入口_抖音网页版短视频免费通道 

搜索