【并查集】概念的温习与用法的升华
并查集适用场景:
快速的判断某个元素属于哪个集合,快速的合并两个集合。</p>
暴力的做法中,查询的复杂度为O(1),合并的复杂度则很高。
在并查集中,并查集的复杂度为接近O(1)。
并查集的特点:
以树的形式来维护一个集合。
根节点的编号就是当前集合的编号。
保存当前节点的父节点。
当查找一个元素所在的集合时:
1.去找当前节点的父节点。
2.如果当前节点不是根节点,那么就继续寻找其父节点。</p>
3.如果是树根,那么p[x] = x;</p>
并查集的路径压缩优化:
采用递归的思想
将当前节点直接连接到祖宗节点上
p[x] = find(p[x]);
非递归的思想
int find(int x)
{
int k, j, r;
r = x;
while(r != parent[r]) //查找跟节点
r = parent[r]; //找到跟节点,用r记录下
k = x;
while(k != r) //非递归路径压缩操作
{
j = parent[k]; //用j暂存parent[k]的父节点
parent[k] = r; //parent[x]指向跟节点
k = j; //k移到父节点
}
return r; //返回根节点的值
}
并查集的按秩合并优化:
高度矮的树合并到高度高的树上
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y) return ;
if(rank[x]<rank[y])
parent[x]=y; // 合并是从rank小的向rank大的连边
else
{
parent[y]=x;
if(rank[x]==rank[y]) rank[x]++;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix