图论算法----并查集中的启发式合并
来源:互联网 发布:交通意外事故数据 编辑:程序博客网 时间:2024/06/05 00:19
一、启发式合并的算法原理
一听这名字,感觉好高大上,实际上很简单。
之前讲过并查集的大部分时间都浪费在了find()函数上,于是就对find()函数进行了优化,其实还有一种算法可以使find()函数的时间复杂度控制在O(logn)左右,这种算法就是启发式合并。
并查集是一种树型的数据结构,而树也有它的深度,如果我们把一棵深度大的树的根节点接在了一棵深度小的树上,那么整棵树的深度为那一棵深度大的树的深度+1,如果我们把一棵深度小的树的根节点接在了一棵深度大的树上,则整棵树的深度为max(深度小的树的深度+1,深度大的树的深度)。这就是启发式合并的原理。
如果感觉很难理解,看下面的图就知道了。
1、有两棵树,一棵高度为3,一棵高度为5。
2、如果是普通的合并,就会造成高度为6的树。
3、如果是启发式合并,最后的树的的高度为5。
好了,启发式合并的原理讲得差不多了,可以发代码了,记住height[]数组初始化为1。
二、启发式合并的代码
void qfsunion(int x,int y){ int a=find(x); int b=find(y); if(height[a]>height[b]) fa[b]=a; else if(height[a]<height[b]) fa[a]=b; else{ fa[a]=b; height[b]++; }}配套一个find()函数:
int find(x){ while(fa[x]!=0) x=fa[x]; return x;}
三、启发式合并与路径压缩之间的问题
这时有人会问了:为什么find()函数不用路径压缩呢?原因很简单,因为有了路径压缩,启发式合并算法就没有多大效果了。
看下面的一组图:
1、被路径压缩后的两棵树:
2、经过启发式合并:
3、又被路径压缩:
可以看出,启发式合并+路径压缩并不是最好的选择,而且路径压缩在主动改变树的高度,但是height数组的值不能同步改变,有可能会让启发式合并出错。
所以启发式合并不能与路径压缩同时使用。
1 0
- 图论算法----并查集中的启发式合并
- 并查集的启发式合并
- 图论算法----并查集中的路径压缩
- 并查集中的合并、删除操作
- 并查集的启发式合并 和 路径压缩
- 并查集的优化---路径压缩与启发式合并
- hdu6109(并查集+启发式合并)
- 简单合并并查集中的子集树
- 并查集——启发式合并,路径压缩
- BZOJ_P2733/Codevs_P1477 [HNOI2012]永无乡(Treap+启发式合并+并查集)
- [BZOJ2733][HNOI2012]永无乡(并查集+splay启发式合并)
- 【bzoj4537】【HNOI2016】【最小公倍数】【并查集+启发式合并+分块】
- poj 1611 The Suspects(启发式式合并,并查集)
- 并查集(路径压缩 && 启发式合并!!!)
- BZOJ4537:[Hnoi2016]最小公倍数 (分块+并查集+启发式合并)
- 【AGC014E】Blue and Red Tree 并查集 启发式合并
- BZOJ 4668 冷战 [并查集][按秩合并&启发式合并]
- 并查集中的最小生成树
- javascript-ife笔记-javascript和树
- 傻傻分不清楚super与this
- Linux中执行shell脚本的4种方法
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- 值得推荐的android开源框架
- 图论算法----并查集中的启发式合并
- Spring MVC中AOP无效、不起作用,解决方案之一
- 使用Spring进行切面(AOP)编程
- 10分钟精通SharePoint-搜索
- 杭电 hdu 2073. 无限的路
- SQL高级语句-SQL 通配符-在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。
- MFC_windows media player控件的使用(VS2013 )
- maven(十)-继承
- 【codeforces 777A】Shell Game