并查集(Disjoint Set)是一种用于处理集合合并和查询连通性的数据结构。它主要支持以下两种操作:
MakeSet(x): 创建一个新的集合,其中包含元素x,并将其作为单独的集合。
Find(x): 查找元素x所属的集合的代表元素(也称为根节点或代表节点)。
并查集通常使用树形结构来表示集合,其中每个节点表示一个元素,树的根节点表示集合的代表元素。树中的每个节点都指向其父节点,根节点没有父节点。
以下是并查集的常见实现方法:
集合表示法:使用一个数组来表示并查集,数组的索引表示元素,数组的值表示该元素的父节点。初始时,每个元素的父节点都是它自己,即构成了独立的集合。当两个集合合并时,将其中一个集合的根节点指向另一个集合的根节点。
基于秩的优化:为了避免树形结构的不平衡,可以使用秩(rank)来表示树的高度或大小。将秩较小的树合并到秩较大的树上,以保持树的平衡。这样可以减少查找和合并操作的时间复杂度。
并查集的典型应用场景包括:
判断图中两个节点是否连通。
解决最小生成树算法中的边选择问题,如Kruskal算法。
在社交网络中判断两个人是否是朋友关系