并查集问题
并查集问题主要用于方便地查询任意个体间有没有关系。
初始个体间的关系没有全局性,是局部、分散的,并查集问题要根据已有的局部分散关系分析得到全局关系。
核心思想:根据关系对个体进行分类、贴标签。把属于一类的都贴上一个标签,可以清楚地分辨哪一个是哪一类,不同的是不是同一类。
具体方法:
为了给同一类贴上一样的标签,涉及两个问题,一个是查询标签,一个是更新标签。查询标签是为了判断是否要合并为同类,更新标签是为了合并后将标签统一。
因为标签对同类个体是公共属性,要放在公共位置。
容易想到的是链表,可以指向同一个位置,查询开销小,更新开销大。
另外就是树结构,将根节点作为同类的标签,查询开销大,更新开销小。
进一步优化:
1. 合并的时候将小类向大类合并,这样相对更新数量少些。
2. 在使用树的时候采用“路径压缩”的技巧,p(x) <- FindSet(p(x)) 的方法将x的父节点提升上去。A->B->C,经过此操作,A跨越B直接指向C。