union、find 操作及路径压缩
必要知识:
find(x):寻找元素 x 所在集合
union(x,y):把元素 x 和元素 y 所在集合合并成一个集合,比较x和y,谁大谁为父节点,相同则谁都行
union(x,y)操作:
若 x 和 y 是当前森林中两棵不同树的根结点,
如果 rank(x) > rank(y) 把 x 作为 y 的父亲
如果 rank(x) < rank(y) 把 y 作为 x 的父亲
如果 rank(x) = rank(y) 把 x 作为 y 的父亲,rank(x) + 1
路径压缩:
find(x) 操作时,找到 x 的根结点 y 之后,再沿着 x 到 y
的路径,改变路径上所有结点的父指针,使其直接指向 y
例子:
图 (a) 表示集合 {1,2,3,4}, {5,6,7,8}
图 (b) 表示执行 union(1,5) 之后的结果
我们看到,union是合并操作,1<5,所以5为父节点,并且会执行路径压缩的操作,因为1的父节点是4,4指向5的父节点