并查集——启发式合并,路径压缩
2016-02-03 15:42
232 查看
一直没想过自己写的并查集的复杂度= =。。。看那一行代码还挺窃喜——贴一下正版的启发式合并,这样复杂度就真正到了反阿克曼函数那什么balabala
一个优化是:把小的树合并到大树中,这样会让深度不太大。这个优化称为启发式合并。
一个优化是把沿途上所有结点的父亲改成根。这一步是顺便的,不增加时间复杂度,却使得今后的操作比较快。这个优化称为路径压缩
用 p[i] 表示 i 的父亲,而 rank[i] 表示 i 的秩,并用秩来代替深度做刚才提到的启发式合并。
一个优化是:把小的树合并到大树中,这样会让深度不太大。这个优化称为启发式合并。
一个优化是把沿途上所有结点的父亲改成根。这一步是顺便的,不增加时间复杂度,却使得今后的操作比较快。这个优化称为路径压缩
用 p[i] 表示 i 的父亲,而 rank[i] 表示 i 的秩,并用秩来代替深度做刚才提到的启发式合并。
void makeset ( int x ){ rank [ x ] = 0; p[x] = x; } int findset ( int x ) { int px = x , i ; while ( px != p [ px ]) px = p [ px ]; // find root while ( x != px ) // path compression { i = p [ x ]; p [ x ] = px ; x = i; } return px ; } void unionset ( int x , int y ) { x = findset ( x ); y = findset ( y ); if ( rank [ x ] > rank [ y ]) p [ y ] = x ; else{ p[x ] = y; if ( rank [ x ] == rank [ y ]) rank [ y ]++; } }
相关文章推荐
- Zigbee介绍
- SPI示例和项目结构记录
- 优化 Android 线程和后台任务开发
- 人生应该要有梦想,万一见鬼了呢?!
- WM_USER
- SQL注入工具
- 准备阶段-mongodb数据库安装
- 统计算法分类
- 基于贝叶斯平均的产品排序方法
- VB.net学习
- Xcode 7 beta发布,Swift 2.0带来哪些新变化?
- Behave + Selenium(Python)一:
- Shell脚本中执行sql语句操作mysql
- 第一章 JVM内存结构
- SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同
- Linux常用指令---ssh/scp
- 隐藏APP图标
- Python教程学习简记1--Python数据类型和变量 字符串和编码 list和tuple 条件判断 循环 dict和set
- [从头学数学] 第71节 图形的运动(二)
- Ubuntu Server上禁止服务