注:这一篇是上一篇《C语言算法1.2:连通问题改进版【视频解析】》的改进版,推荐先阅读上一篇再阅读本篇。
一、来源
来自《算法:C语言实现(第1-4部分)第3版》书的程序1.3。
二、两个版本的区别
两个版本都是使用数组来实现的,假设有一个一维数组a,大小为10,a[0]到a[9]中存的值分别为0~9,即每个元素的值都不一样。
1.2版本 | 1.3版本 | |
---|---|---|
实现逻辑 | 使用树结构,合并时,把左边的树合并到右边的树下。 | 使用树结构,合并时,把深度较小的树合并到深度较大的树下。 |
优缺点 | 查找慢、合并快 | 查找快、合并也快 |
三、1.3版本的示意图
在之前的1.2版本中,总是把左侧的树合并到右侧的树下,导致树的深度极度拉长,往上找根节点时要查询的次数非常多。
而在现在的1.3版本中,总是把小的树合并到大的树下,做到了树深度的平衡,因此往上找根节点时要查询的次数少很多。
四、性能测试结果
节点数量 | 1.2版本耗时(毫秒) | 1.3版本耗时(毫秒) | 耗时比 |
---|---|---|---|
1万 | 0 | 0 | 忽略 |
10万 | 3199 | 2 | 1599 |
100万 | 50522 | 25 | 2020 |
- 性能提升达到1000倍以上。
- 节点数量越多,性能提升越高。
五、源码
源文件比较多,就不在文章里贴了,链接在这里:github、gitee
六、过程示意图
全文完