普林斯顿大学算法公开课(2)----并查集
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。
Dynamic connectivity:
(1)Find query,检查两个物体是否在一个单元中。
(2)Union command,连接2个单元,使得这个单元包含这两个物体。
Quick find:id[p] is p的单元id
(1)Find:p and q索引的id是否相同。
(2)Union:合并p=q,则要合并所有条目的id=id[p],id=id[q]。
Quick Union:id[p] is p的i的父节点
(1)Find:检查p和q是否有同一个root。
(2)Union:set p的root为q的root。
Improvement:
(1)Weighted Quick-Union。在进行合并的时候,会首先判断待合并的两棵树的大小,即总是size小的树作为子树和size大的树进行合并。这样就能够尽量的保持整棵树的平衡。
(2)Weighted Quick-Union With Path Compression。在find方法的执行过程中,不是需要进行一个while循环找到根节点嘛?如果保存所有路过的中间节点到一个数组中,然后在while循环结束之后,将这些中间节点的父节点指向根节点,不就行了么?但是这个方法也有问题,因为find操作的频繁性,会造成频繁生成中间节点数组,相应的分配销毁的时间自然就上升了。那么有没有更好的方法呢?还是有的,即将节点的父节点指向该节点的爷爷节点,这一点很巧妙,十分方便且有效,相当于在寻找根节点的同时,对路径进行了压缩,使整个树结构扁平化。
算法性能:
对于Quick-Union算法而言,节点组织的理想情况应该是一颗十分扁平的树,所有的孩子节点应该都在height为1的地方,即所有的孩子都直接连接到根节点。这样的组织结构能够保证find操作的最高效率。
动态连通性相关的Union-Find算法基本上就介绍完了,从容易想到的Quick-Find到相对复杂但是更加高效的Quick-Union,然后到对Quick-Union的几项改进,让我们的算法的效率不断的提高。这几种算法的时间复杂度如下所示:
Algorithm |
Constructor |
Union |
Find |
Quick-Find |
N |
N |
1 |
Quick-Union |
N |
Tree height |
Tree height |
Weighted Quick-Union |
N |
lgN |
lgN |
Weighted Quick-Union With Path Compression |
N |
Very near to 1 (amortized) |
Very near to 1 (amortized) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库