并查集理解以不相交的集合为基础的抽象数据类
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2018/10/7 福州大学数学与计算机科学学院 2
《算法与数据结构》
Algorithms and Data Structures
11 并查集
11.2 用数组实现并查集
class UnionBiblioteka Baiduind{ public: UnionFind(int size); ~UnionFind() {delete [ ] Components;} int Find(int e); void Union(int i, int j); private: int *Components; int n; };
2018/10/7 福州大学数学与计算机科学学院 5
《算法与数据结构》
Algorithms and Data Structures
11 并查集
11.3 用父亲数组实现并查集
改进办法: 在树根中保存该树的结点数,每次合并时总是将小树合并到大树上去。 当一个结点从一棵树移到另一棵树上去时,这个结点到树根的距离就 增加1,而这个结点所在的树的大小至少增加一倍。于是并查集中每 个结点至多被移动O(logn)次,从而每个结点到树根的距离不会超过 O(logn) 。所以每次Find运算只需要O(logn)时间。 采用路径压缩技术 在执行Find时,实际上找到了从一个结点到树根的一条路径。路径压 缩就是把这条路上的所有结点都改为树根的儿子。实现路径压缩的最 简单的方法是在这条路上走2次,第1次找到树根,第2次将路上所有 结点的父结点都改为树根。 路径压缩并不影响Union运算的时间,它仍然只要O(1)时间。但是路 径压缩大大地加速了Find运算。
其中:n是集合中元素的个数。Components是表示元素及其所属子集 关系的数组,Components[x]表示元素x当前所属的集合的名字。
2018/10/7 福州大学数学与计算机科学学院 3
《算法与数据结构》
Algorithms and Data Structures
11.3 用父亲数组实现并查集
2018/10/7 福州大学数学与计算机科学学院 6
《算法与数据结构》
Algorithms and Data Structures
THE
2018/10/7
END
7
福州大学数学与计算机科学学院
《算法与数据结构》
Algorithms and Data Structures
第十一章并查集
理解以不相交的集合为基础的抽象数据类型并查集。
掌握用数组实现并查集的方法。 掌握用树结构实现并查集的方法。 理解将小树合并到大树的合并策略及其实现。 掌握路径压缩技术及其实现方法。
2018/10/7
}; 其中parent是表示树结构的父亲数组。元素x的父结点为parent[x]。
2018/10/7 福州大学数学与计算机科学学院 4
《算法与数据结构》
Algorithms and Data Structures
11 并查集
11.3 用父亲数组实现并查集
Find(e)运算就是从元素e相应的结点走到树根处,找出所在集合的名字。 int UnionFind::Find(int e) { while (parent[e]) e = parent[e]; return e; } 合并2个集合,只要将表示其中一个集合的树的树根改为表示另一个集合 的树的树根的儿子。 void UnionFind::Union(int i, int j) { parent[j] = i; } 容易看出,在最坏情况下,合并可能使n个结点的树退化成一条链。在这 种情况下对所有元素各执行一次Find将耗时O(n2)。 如何改进???
采用树结构实现并查集的基本思想是,每个集合用一棵树来表示。树的 结点用于存储集合中的元素名。每个树结点还存放一个指向其父结点的 指针。树根结点处的元素代表该树所表示的集合。利用映射可以找到集 合中元素所对应的树结点。 父亲数组是实现上述树结构的有效方法。 class UnionFind{ public: UnionFind(int n); ~UnionFind() {delete [] parent;} int Find(int e); void Union(int i, int j); private: int *parent;
福州大学数学与计算机科学学院
1
《算法与数据结构》
Algorithms and Data Structures
11 并查集
11.1 并查集的定义及其简单实现
在一些应用问题中,需将n个不同的元素划分成一组不相交的 集合。开始时,每个元素自成一个单元素集合,然后按一定 顺序将属于同一组元素的集合合并。其间要反复用到查询某 个元素属于哪个集合的运算。适合于描述这类问题的抽象数 据类型称为并查集。它的数学模型是一组不相交的动态集合 的集合S={A,B,C,…},它支持以下的运算: (1)Union(A,B):将集合A和B合并,其结果取名为A或B; (2)Find(x):找出包含元素x的集合,并返回该集合的名字。 并查集的一个应用是确定集合上的等价关系。
《算法与数据结构》
Algorithms and Data Structures
11 并查集
11.2 用数组实现并查集
class UnionBiblioteka Baiduind{ public: UnionFind(int size); ~UnionFind() {delete [ ] Components;} int Find(int e); void Union(int i, int j); private: int *Components; int n; };
2018/10/7 福州大学数学与计算机科学学院 5
《算法与数据结构》
Algorithms and Data Structures
11 并查集
11.3 用父亲数组实现并查集
改进办法: 在树根中保存该树的结点数,每次合并时总是将小树合并到大树上去。 当一个结点从一棵树移到另一棵树上去时,这个结点到树根的距离就 增加1,而这个结点所在的树的大小至少增加一倍。于是并查集中每 个结点至多被移动O(logn)次,从而每个结点到树根的距离不会超过 O(logn) 。所以每次Find运算只需要O(logn)时间。 采用路径压缩技术 在执行Find时,实际上找到了从一个结点到树根的一条路径。路径压 缩就是把这条路上的所有结点都改为树根的儿子。实现路径压缩的最 简单的方法是在这条路上走2次,第1次找到树根,第2次将路上所有 结点的父结点都改为树根。 路径压缩并不影响Union运算的时间,它仍然只要O(1)时间。但是路 径压缩大大地加速了Find运算。
其中:n是集合中元素的个数。Components是表示元素及其所属子集 关系的数组,Components[x]表示元素x当前所属的集合的名字。
2018/10/7 福州大学数学与计算机科学学院 3
《算法与数据结构》
Algorithms and Data Structures
11.3 用父亲数组实现并查集
2018/10/7 福州大学数学与计算机科学学院 6
《算法与数据结构》
Algorithms and Data Structures
THE
2018/10/7
END
7
福州大学数学与计算机科学学院
《算法与数据结构》
Algorithms and Data Structures
第十一章并查集
理解以不相交的集合为基础的抽象数据类型并查集。
掌握用数组实现并查集的方法。 掌握用树结构实现并查集的方法。 理解将小树合并到大树的合并策略及其实现。 掌握路径压缩技术及其实现方法。
2018/10/7
}; 其中parent是表示树结构的父亲数组。元素x的父结点为parent[x]。
2018/10/7 福州大学数学与计算机科学学院 4
《算法与数据结构》
Algorithms and Data Structures
11 并查集
11.3 用父亲数组实现并查集
Find(e)运算就是从元素e相应的结点走到树根处,找出所在集合的名字。 int UnionFind::Find(int e) { while (parent[e]) e = parent[e]; return e; } 合并2个集合,只要将表示其中一个集合的树的树根改为表示另一个集合 的树的树根的儿子。 void UnionFind::Union(int i, int j) { parent[j] = i; } 容易看出,在最坏情况下,合并可能使n个结点的树退化成一条链。在这 种情况下对所有元素各执行一次Find将耗时O(n2)。 如何改进???
采用树结构实现并查集的基本思想是,每个集合用一棵树来表示。树的 结点用于存储集合中的元素名。每个树结点还存放一个指向其父结点的 指针。树根结点处的元素代表该树所表示的集合。利用映射可以找到集 合中元素所对应的树结点。 父亲数组是实现上述树结构的有效方法。 class UnionFind{ public: UnionFind(int n); ~UnionFind() {delete [] parent;} int Find(int e); void Union(int i, int j); private: int *parent;
福州大学数学与计算机科学学院
1
《算法与数据结构》
Algorithms and Data Structures
11 并查集
11.1 并查集的定义及其简单实现
在一些应用问题中,需将n个不同的元素划分成一组不相交的 集合。开始时,每个元素自成一个单元素集合,然后按一定 顺序将属于同一组元素的集合合并。其间要反复用到查询某 个元素属于哪个集合的运算。适合于描述这类问题的抽象数 据类型称为并查集。它的数学模型是一组不相交的动态集合 的集合S={A,B,C,…},它支持以下的运算: (1)Union(A,B):将集合A和B合并,其结果取名为A或B; (2)Find(x):找出包含元素x的集合,并返回该集合的名字。 并查集的一个应用是确定集合上的等价关系。