并查集原理

# 用处

动态维护若干不重叠的集合,并支持查询与合并

两个操作

1)find 查询,一个元素属于哪一个集合

2)merge 合并,将两个集合合并为一个

集合的表示方法:代表元法

即每个集合选取一个固定的元素表示整个集合

然后是归属关系的表示方法,用一颗树形结构储存每个集合,树上的每一个节点都是一个元素,树根是集合的代表元素,整个并查集是一个森林。仍然可以维护一个数组fa来记录这个森林,用fa[x]保存x的父节点,树根的fa等于自己,合并的时候只需要连接两个树根即可。

# 路径压缩

每次执行find时都将元素直接指向树根,使用路径压缩的并查集,每次find的平均复杂度为O(logN)

# 按秩合并

秩:树的深度或着是集合的大小

将秩记录在树根上,在合并的时候都把秩小的合并到秩大的树上。

当秩表示的是集合的大小的时候按秩合并又叫启发式合并,通用于各种数据结构,即将小的结构合并到大的结构之中,并且只会增加小的结构的查询代价,这样增加的总代价不会超过NlogN,单独采用按秩合并的get的平局复杂度也为O(logN)

同时采用路径压缩和按秩合并的get的平均复杂度可以达到O(α(N)),α(N)为反阿克曼函数,几乎可以认为是常数。

# 并查集具体操作

1)储存 使用一个数组fa保存父节点 int fa[SIZE]

2)初始化 n个元素,开始每个都是单独的集合

3)find操作 x是树根的话,x就是集合代表,否则递归访问fa[x]直到根

4)merge 操作 合并x和y所在的集合,找到他们的根,将其中一个的父表示为另一个的根

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12438911.html
今日推荐