面试之并查集

输入和输出的注意点: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];
    
}
相关推荐
JAVA96511 小时前
JAVA面试-并发篇 05-并发包AQS队列实现原理是什么
java·开发语言·面试
kyriewen12 小时前
浏览器缓存最强攻略:强缓存、协商缓存、CDN、更新策略,一篇搞定
前端·面试·浏览器
JAVA社区16 小时前
Java高级全套教程(十四)—— SpringData超详细实战详解
java·开发语言·spring cloud·面试·职场和发展
ricardo197316 小时前
Web Worker + 时间切片:破解主线程阻塞的两种武器
前端·面试
神奇小汤圆16 小时前
业务 Agent 搭建指南:别急着重造 Agent,用知识、工具与评测跑通闭环
面试
西安邮电大学16 小时前
binlog/redolog/undolog三者对比
java·后端·其他·面试
牛油果子哥q18 小时前
【C++指针与引用】C++指针与引用底层彻底精讲:本质区别、易错深坑、底层内存模型、工程选型、笔试面试满分解析
c++·面试
西安邮电大学19 小时前
Redis四大经典缓存问题
java·redis·后端·其他·面试
李剑一20 小时前
面试问网络?问到我的软肋了。面试官:讲一下HTTP强缓存与协商缓存
前端·面试
Darling噜啦啦21 小时前
正则表达式实战指南:从手机号验证到模板引擎,5 个案例彻底搞懂 RegExp
javascript·面试