并查集(union-findsets)是一种数据结构,其主要用于处理一些不相交集合的合并问题。**一些常见的应用场景,求连通子图,求最小生成数算法和求最近公共祖先(LCA)**等
并查集问题往往是只考虑连通性的问题,典型问题如leetcode 990题等式方程的可满足性。这种数据结构主要支持合并和查询元素是否在同一个集合之中,底层结构是数组或者是哈希表。用于表示结点指向父节点,初始化是指向自己。
合并就是把一个集合的根节点指向另一个集合的根节点,只要根节点一样,就表示是同一个集合。
路径压缩和按秩合并
路径压缩分为:隔代压缩和完全压缩,其发生在查询过程中。
隔代压缩的代码:
p
a
r
e
n
t
[
x
]
=
p
a
r
e
n
t
[
p
a
r
e
n
t
[
x
]
]
parent[x] = parent[parent[x]]
parent[x]=parent[parent[x]];
完全压缩:需要借助递归,
p
a
r
e
n
t
=
f
i
n
d
(
p
a
r
e
n
t
[
x
]
)
parent=find(parent[x])
parent=find(parent[x])
按秩合并是指在高度更低的树的根节点指向高度更高的根节点,以避免合并以后树的高度增加,
路径压缩和按秩合并一起使用时,难以维护秩的准确定义,但是依然具有参考价值。
时间复杂度接近与
o
(
1
)
o(1)
o(1)
一般二者只选择其一。