本文参考bobo老师的数据结构教学视频。
目的
解决连接问题。
实现图相关算法,是一种特别的树形结构。
应用
1)连接问题:图上任意2个点是能通过中间点连通
!不能回答路径问题
2)数学中集合类的实现
复杂度
时间复杂度近乎为O(1)
实现思路
基本操作
union(p,q) :把q点和p点各自所属的组的所有点合并成一个
find(p) :查询点p所属的组
isConnected(p,q) :判断点p和q是否属于同一组
实现1:数组
数组的idx对应的值 表示其属于的哪个集合
实现2:数组表达树
数组的idx对应的值 表示父亲的位置,根节点指向自己。
union的时候只需要修改根节点的指向即可。
find 从节点向父亲追溯,直到父亲指向自己时则为根节点
实现3
问题:极端情况下,树会变成链
优化union:记录每个组的元素数量,每次把较少元素的组指向较多元素的组
实现4
问题:元素多的组不一定层数更多 // 这种极端情况出现不多
优化union:记录每个组的层数,每次把层数少的根指向层数多的根,只要在两个组层数相等时才需要更新层数记录
实现5
优化find 1:查找点p的根节点时,从p向上找时,不断让当前节点指向父亲的父亲。(能让链变成平衡树)
优化find 2:向上找根时,让链路上的所有点度指向根,用递归实现。(但是这边多了递归的开销)