概念:
是一种树形的树形结构,主要用于解决不交集的合并以及查询问题;相对应的有一种
联合-查找算法(union-find-algorithm)定义了两个用于此数据结构的操作:
- 查询(Find):确定元素是否在同一个集合中;
- 合并(Union):把两个不相交的集合合并为一个集合
个人理解:
针对该算法三个核心步骤依次为:初始化 ==>查找 ==>合并
初始化:将每个元素视为一个节点其父节点为自己(通常初始化为一个数组);
查找:也就是查找两个节点是否在同一连通分量中;(通常就是找两个节点的父节点
是否一致);
合并:根据你自己定的规则,将节点按照某种顺序连接起来;(这个规则也就是用于
产生代表,通过代表来做后续的处理);
示例:
(初始化)如有编号为1, 2, 3, ..., n的n个元素,我们用一个数组fa[]来存储每个元素的
父节点(因为每个元素有且只有一个父节点,所以这是可行的)。一开始,
我们先将它们的父节点设为自己。
(查找)我们用递归的写法实现对代表元素的查询:一层一层访问父节点,直至根节点
(根节点的标志就是父节点是本身)。要判断两个元素是否属于同一个集合,只
需要看它们的根节点是否相同即可。
(合并)合并操作也是很简单的,先找到两个集合的代表元素,然后将前者的父节点设
为后者即可。当然也可以将后者的父节点设为前者,这里暂时不重要。本文末
尾会给出一个更合理的比较方法。
使用场景(可见下面情形):
leecode:547 朋友圈;684 冗余连接;面试题 17.07 婴儿名字
总结:
针对并查集来讲就像一个关键点由这个关键点可以牵待出一系列问题;