并查集知识学习
2016-05-12 21:39
260 查看
(转)
并查集的作用:并和查,即合并和查找,将一些集合合并,快速查找或判断某两个集合的关系,或某元素与集合的关系,或某两个元素的关系。
并查集的结构:并查集主要操作对象是森林,树的结构赋予它独特的能力,对整个集合操作转换为对根节点(或称该集合的代表元素)的操作,一个集合里的元素关系不一定确定,但相对于根节点的关系很明了,这也是为了查找方便。
并查集优化方法:按秩合并和路径压缩的配合使用,使得查找过程优化到极致。按秩合并,每次将深度小的树合并到深度大的树里面去,使得整棵树尽量矮;路径压缩,将当前节点到根节点路径上的所有点直接连到根节点上,使得每个点到根节点的距离更短,在下一次查找的时候更快。
如何快速确定偏移量公式:
例:现在要合并节点x,y, 找到根节点fx = Find(x); fy = Find(y);一般情况下,根节点的偏移量都保持为0, offset[foot] = 0;如果要使得x和y的偏移量为t,假设fx指向fy,则可以写出公式offset[x] + offset[fx] - offset[y] = t,则offset[fx] = (offset[y] + t - offset[x]) % n; 这个n即为总共有多少类,如:在poj1182 食物链中n = 3,,在poj2492 A Bug's Life中n = 2, 这样fx的偏移量就计算出来了,只需要改其中一个根节点的偏移量,这里是fx,因为假设是fx指向fy。
非递归路劲压缩:
View Code
并查集的作用:并和查,即合并和查找,将一些集合合并,快速查找或判断某两个集合的关系,或某元素与集合的关系,或某两个元素的关系。
并查集的结构:并查集主要操作对象是森林,树的结构赋予它独特的能力,对整个集合操作转换为对根节点(或称该集合的代表元素)的操作,一个集合里的元素关系不一定确定,但相对于根节点的关系很明了,这也是为了查找方便。
并查集优化方法:按秩合并和路径压缩的配合使用,使得查找过程优化到极致。按秩合并,每次将深度小的树合并到深度大的树里面去,使得整棵树尽量矮;路径压缩,将当前节点到根节点路径上的所有点直接连到根节点上,使得每个点到根节点的距离更短,在下一次查找的时候更快。
如何快速确定偏移量公式:
例:现在要合并节点x,y, 找到根节点fx = Find(x); fy = Find(y);一般情况下,根节点的偏移量都保持为0, offset[foot] = 0;如果要使得x和y的偏移量为t,假设fx指向fy,则可以写出公式offset[x] + offset[fx] - offset[y] = t,则offset[fx] = (offset[y] + t - offset[x]) % n; 这个n即为总共有多少类,如:在poj1182 食物链中n = 3,,在poj2492 A Bug's Life中n = 2, 这样fx的偏移量就计算出来了,只需要改其中一个根节点的偏移量,这里是fx,因为假设是fx指向fy。
非递归路劲压缩:
1、make_set(x) 把每一个元素初始化为一个集合 建立一个新的集合,其中集合只有唯一的一个元素x 2、union_set(x, y) 按秩合并x,y所在的集合 3、find_set(x)返回x所在的集合的代表 在执行查找操作时,要沿着父节点指针一直找下去,直到找到树根为止。大家要注意途中的箭头。 4、实现并查集的标准代码: 1 #include <stdio.h> 2 3 const int MAXN = 100; /*结点数目上线*/ 4 int pa[MAXN]; /*p[x]表示x的父节点*/ 5 int rank[MAXN]; /*rank[x]是x的高度的一个上界*/ 6 7 void make_set(int x) 8 {/*创建一个单元集*/ 9 pa[x] = x; 10 rank[x] = 0; 11 } 12 13 int find_set(int x) 14 {/*带路径压缩的查找*/ 15 if(x != pa[x]) 16 pa[x] = find_set(p[x]); 17 return pa[x]; 18 } 19 20 /*按秩合并x,y所在的集合*/ 21 void union_set(int x, int y) 22 { 23 x = find_set(x); 24 y = find_set(y); 25 if(rank[x] > rank[y])/*让rank比较高的作为父结点*/ 26 pa[y] = x; 27 else 28 { 29 pa[x] = y; 30 if(rank[x] == rank[y]) 31 rank[y]++; 32 } 33 }
View Code
相关文章推荐
- POJ Anniversary Cake (dfs,神剪)
- nyoj 311 完全背包
- 操作系统3.0
- Java与Oracle中日期转换
- 《UNIX环境高级编程》(system)
- 监控MySQL服务是否正常
- 监控MySQL服务是否正常
- 统计多台linux主机的CPU内存swap的使用比例
- all-delete-orphan
- hdu 5670 Machine(模拟)
- [翻译+山寨]Hangfire Highlighter Tutorial
- python正则表达式
- hex2pcap
- 105_Volley源码解析
- tigase
- 343. Integer Break 分析证明与python解答
- 策略模式
- [转]读研or工作--阿里巴巴吴翰清的邮件[技术性内容, 慎入]
- usaco奶牛家谱
- JAVA环境变量配置和常用DOS命令