首页 > 代码库 > 并查集问题

并查集问题

并查集问题主要用于方便地查询任意个体间有没有关系。

初始个体间的关系没有全局性,是局部、分散的,并查集问题要根据已有的局部分散关系分析得到全局关系。

核心思想:根据关系对个体进行分类、贴标签。把属于一类的都贴上一个标签,可以清楚地分辨哪一个是哪一类,不同的是不是同一类。

具体方法:

为了给同一类贴上一样的标签,涉及两个问题,一个是查询标签,一个是更新标签。查询标签是为了判断是否要合并为同类,更新标签是为了合并后将标签统一。

因为标签对同类个体是公共属性,要放在公共位置。

容易想到的是链表,可以指向同一个位置,查询开销小,更新开销大。

另外就是树结构,将根节点作为同类的标签,查询开销大,更新开销小。

进一步优化:

1. 合并的时候将小类向大类合并,这样相对更新数量少些。

2. 在使用树的时候采用“路径压缩”的技巧,p(x) <- FindSet(p(x)) 的方法将x的父节点提升上去。A->B->C,经过此操作,A跨越B直接指向C。

并查集问题