并查集的路径压缩算法
2015-07-21 11:54
232 查看
使用并查集查找时,如果查找次数很多,那么使用朴素版的查找方式肯定要超时。比如,有一百万个元素,每次都从第一百万个开始找,这样一次运算就是10^6,如果程序要求查找个一千万次,这样下来就是10^13,肯定要出问题的。
这是朴素查找的代码,适合数据量不大的情况:
下面是采用路径压缩的方法查找元素:
上面是一采用递归的方式压缩路径, 但是,递归压缩路径可能会造成溢出栈,我曾经因为这个RE了n次,下面我们说一下非递归方式进行的路径压缩:
这是朴素查找的代码,适合数据量不大的情况:
int findx(int x) { int r=x; while(parent[r] !=r) r=parent[r]; return r; }
下面是采用路径压缩的方法查找元素:
int find(int x) //查找x元素所在的集合,回溯时压缩路径 { if (x != parent[x]) { parent[x] = find(parent[x]); //回溯时的压缩路径 } //从x结点搜索到祖先结点所经过的结点都指向该祖先结点 return parent[x]; }
上面是一采用递归的方式压缩路径, 但是,递归压缩路径可能会造成溢出栈,我曾经因为这个RE了n次,下面我们说一下非递归方式进行的路径压缩:
int find(int x) { int k, j, r; r = x; while(r != parent[r]) //查找跟节点 r = parent[r]; //找到跟节点,用r记录下 k = x; while(k != r) //非递归路径压缩操作 { j = parent[k]; //用j暂存parent[k]的父节点 parent[k] = r; //parent[x]指向跟节点 k = j; //k移到父节点 } return r; //返回根节点的值 }
相关文章推荐
- js中json字符串转换为json对象
- 数据结构与算法-为什么要使用算法
- 数据结构与算法-为什么要使用算法
- 大数据时代的全能日志分析专家--Splunk安装与实践
- python 代码检查,实现行级代码优化
- JMeter实现bugfree创建bug测试
- PostgreSQL设置自增长从当前最大值开始
- 构造和析构的顺序
- MSSQL版本查询
- 多线程基础知识
- 格力手机首销仅数万台 董明珠个人招牌难奏效
- TortoiseGit + GitHub 使用指南
- 网络数据请求实践一:android-async-http实现下载和上传
- ios设备抓包方法
- android应用移动到SD卡_如何允许移动?_android:installLocation属性使用
- POJ-2627-Sudoku-DFS
- PAT 1005. Spell It Right (注意考虑0的情况)
- linux、window下搭建开源版禅道
- javascript专业八级测试答案整理
- 【tool】Android应用测试经验总结