面试之并查集

输入和输出的注意点:scanf读取字符时会读取空格和回车

而scanf读字符串时会自动忽略空格和回车

并查集快速处理两类操作:

  1. 将2个集合合并
  2. 询问两个元素是否在一个集合当中

几乎O(1)完成这两个操作

基本原理

每个集合用一棵树来表示,树根的编号就是整个集合的编号, 每个节点存储它的父节点,用一维数组p[x]来存储这个集合,px表示x的父节点.

问题

  • 如何判断树根 :if(p[x] == x)
  • 如何求x的集合编号:while(p[x] != x) x=p[x];
  • 如何合并两个集合: 输入2个数,不妨认为它们是两棵树(只有一个节点).px是x的根节点,py是y的根节点:
    p[x] = y

优化

路径优化,只要一条路能到达父节点,沿途路径上的点都能够到达父节点.

递归实现:

c 复制代码
int find(int x) 
{
  
  if(x != q[x]) q[x] =find(q[x]);
  return q[x];
    
}
相关推荐
奔跑的蜗牛ing1 小时前
CentOS Nginx 安装与静态文件服务器配置指南
前端·面试·架构
KaifuZeng4 小时前
通信与接口协议面试五、RS422
嵌入式硬件·面试·通信与接口
SamDeepThinking6 小时前
组合还是继承?我在项目里主要看这两个判断
java·后端·面试
wear工程师6 小时前
setState 到底是不是异步的?这题从 React 16 问到 18,标准答案早就变了
react.js·面试
SamDeepThinking8 小时前
为什么很多人学了Java,还是没真正理解类和对象?
java·后端·面试
阿新聊ai9 小时前
Claude Code 为什么总不懂你的项目?缺一张「项目地图」
前端·后端·面试
用户852495071849 小时前
Promise 全解析:从三状态到 Promise.all
面试
嘟嘟071710 小时前
Node.js spawn 实现迷你 Cursor 自动化终端|子进程完整解析
前端·后端·面试
weedsfly10 小时前
纯函数与副作用——前端开发中最容易被忽视的质量保证
前端·javascript·面试
whaledown10 小时前
互联网大厂Java求职面试三轮提问详解(涵盖Spring Boot、微服务、Kafka等核心技术)
java·jvm·数据库·spring boot·微服务·面试·kafka