思考1:并查集中树的存储结构表示为何采用双亲表示法
因为我们要不断回溯,因此不选用找双亲困难的孩子表示法;而我们还要不断合并树,故不选择合并逻辑复杂的孩子兄弟表示法。我们采用双亲表示法。
思考2:并查集的优化个人总结
优化中心思路:让树的高度尽量低,因为树越高查找的耗费的时间越多。
对于合并操作:我们希望合并之后树至少不会增高,我们有两种选择:
- 让结点少的树合并到结点多的树中,这也就是基于size的优化
- 结点少的树一般高度低于结点多的树,当然不排除高于情况
- 但这种优化方式和路径压缩优化可以共存,因为树的结点数存放在根结点,而路径压缩优化不会改变结点个数
- 让高度低的树合并到高度高的树中,这也就是基于rank的优化
- rank小的树合并到rank高的树,这样rank可以不变
- 但是它和路径压缩不能很好的共存,因为路径优化会改变树的高度,rank的维护比较麻烦
对于查找操作:我们可以利用每次查找路径的过程,降低树的高度,有两种已知的算法:
-
王道考研:
- 先回溯一次找到根结点,再从头回溯一次,把路径上的结点都连接到根结点上
- 有限次查找后,树的高度会降为2
- 注意到这里是两次回溯,但它做到了一次回溯把路径上的结点全部连接到根节点上了
-
另一种算法:
- 回溯过程中,每访问到一个结点,就把它连接到它父结点的父结点上
- 有限次查找后,树的高度会降为2
- 是一次回溯,每次访问都只会把路径上,离根结点路径长度为2的那一个结点连接到根结点上
如有错误欢迎评论区指正