1. 定义:并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题
2. 两个操作:
(1)合并两个不相交的集合;
待合并的集合间是没有交集的,合并后集合内部元素不重复
(2)查找给定元素所属的集合
3. 集合代表:为每个集合选定一个固定的元素,称为代表(根结点),以表示整个集合
(1)合并两个不相交的集合
本质:使一个集合的祖先(代表)成为另一个集合的祖先(代表)
本质:使一个集合的祖先(代表)成为另一个集合的祖先(代表)
(2)查找给定元素的所属的集合
本质:找到所在集合的代表
4. 并查集的链表表示
(1)每一个集合用一个链表表示、
(2)链表的每一个元素代表集合的一个成员
(3)链表的第一个元素作为集合的代表
(4)链表中的元素顺序可以是任意的
(1)每一个集合用一个链表表示、
(2)链表的每一个元素代表集合的一个成员
(3)链表的第一个元素作为集合的代表
(4)链表中的元素顺序可以是任意的
5. 并查集的树型表示
(1)每棵树表示一个集合
(2)树中结点代表集合中的元素
(3)树的根作为集合的代表
(4)树中指针的指向不是唯一的
(5)使用一维数组模拟树
(1)每棵树表示一个集合
(2)树中结点代表集合中的元素
(3)树的根作为集合的代表
(4)树中指针的指向不是唯一的
(5)使用一维数组模拟树
6. 构造树型并查集
7.并查集的树型结构的优化
树型结构的瓶颈:查找和合并操作的核心是查找,找根时间复杂度是O(n),找到根后合并集合的时间复杂度是O(1)
优化思想:给出元素,尽量减少找根的时间
优化方法:(1)按秩合并
按 树的结点个数 或 树的深度 合并
降低查找根的时间复杂度由O(n) 变成 O(lgn)
(2) 路径压缩
由O(lgn) 变成近似常数
按 树的结点个数 或 树的深度 合并
降低查找根的时间复杂度由O(n) 变成 O(lgn)
(2) 路径压缩
由O(lgn) 变成近似常数
优化一、按树的结点个数合并
思想:使结点个数少的树成为结点个数多的树的子树。
集合合并时,如果都是按照结点个数进行合并,那么任意结点的深度均不超过logn + 1
思想:使结点个数少的树成为结点个数多的树的子树。
集合合并时,如果都是按照结点个数进行合并,那么任意结点的深度均不超过logn + 1
优化二、按树的深度合并
思想:使深度浅的树成为深的树的子树,新生成的树,深度不会增加
集合合并时,如果都是按照树的深度进行合并,那么任意结点的深度均不超过logn + 1
集合合并时,如果都是按照树的深度进行合并,那么任意结点的深度均不超过logn + 1
优化三、路径压缩
路径压缩的原因:
(1)集合按秩合并时,仍能形成深度为lgn的树
(2)节点找根时,需要遍历一遍所在路径才能找到根
(3)对于一个节点,我们只关心它属于哪个集合(只关心它的根是谁,而不关心他的父亲是谁)
思想:在查找根时,可以直接把路径上的所有元素的父亲变成根,下次查找可以直接找到根
总体上,查找的时间复杂度基本可以认为是常数的
(2)节点找根时,需要遍历一遍所在路径才能找到根
(3)对于一个节点,我们只关心它属于哪个集合(只关心它的根是谁,而不关心他的父亲是谁)
思想:在查找根时,可以直接把路径上的所有元素的父亲变成根,下次查找可以直接找到根
总体上,查找的时间复杂度基本可以认为是常数的