并查集是一种比较冷门的数据结构,通常用于查找无向图是否存在环。在做无向图是否有环的时,一般是用深度或者广度优先搜索遍历一遍,但是并查集提供了另一种思路。
首先需要用一个parent数组来记录该点的连接点,通过这个数组的一个位置来寻找它的最父辈的点。首先按照数组大小新建一个parent数组并将其初始化为-1,假如搜索到一个点的parent值为-1则它就是最顶点的一个。
第二个就是搜索函数,输入一个点去寻找它的根节点,通过一个循环函数,达到目的。
最后就是合并函数,将两点输入进来,通过搜索函数搜索,假如两点的根节点为同一个说明这两点在一个环内,假如两点根节点不同,说明不在一个环内,将y连接到x上。
测试一下,将含有一个环的图输入。
得到的结果也是相同的。
当然这个结构还可以进一步优化。
首先第一个是按秩合并:新设置一个rank数组纪录长度。按秩合并需要满足规则是短树接长数,相同父辈数加加,也就是说假如两点rank中的数有大小的话,将rank数小的树接到rank数大的下面。假如rank数相同的话,随便选择一个连接方向,父辈点的rank值加一。
第二个是加速查询。通过递归的方法去找根节点。