使用森林存储集合之间的关系,属于同一集合的不同元素,都有一个相同的根节点,代表着这个集合。
当进行查找某元素属于哪个集合时,即遍历该元素到根节点,返回根节点所代表的集合;遍历过程中使用路径压缩的优化算法,使整体树的形状更加扁平,从而优化查询的时间复杂度。
当进行合并时,即将两颗子树合并为一棵树,将一棵子树的根节点指向另一棵子树的根节点;在合并时可按子树的大小,将规模较小的子树合并到规模较大的子树上,从而使树规模更加平衡,从而优化未来查询的时间复杂度。
#include<vector>
class DisjointSet
{
public:
DisjointSet(int n)
{
for (int i = 0; i < n; i++)
{
_id.push_back(i);
_size.push_back(1);
}
_count = n;
}
~DisjointSet() {
}
int find(int p)
{
while (p != _id[p])
{
_id[p] = _id[_id[p]];
p = _id[p];
}
return p;
}
void print_set()
{
printf("元素: