并查集
概念:
并查集是一种用来管理元素分类情况的数据结构。并查集可以高效的进行合并和查询操作,但是却无法进行分割操作。
既然是数据结构,自然有逻辑结构和存储结构。
逻辑结构: 树
存储结构: 顺序存储的结构,方便操作。
应用:
1. 基本应用:
并查集最基础的应用就是在大量的数据中,进行分类。给定任意两个元素,可以高效的判断是否为同一类。参考:HDU1213, POJ1611
2. 带权并查集:
在第一种基础操作上,有些题中,会出现一些元素直接有不同的关系,比如A, B, C的关系,A>B, B>C, 那么就可以退出来A>C。类似这样的。这时候单靠一个简单的并查集不能完整表示出所有元素的关系,所以我们需要另开一个sum[ ]数组储存某元素与其根结点的距离,来表示关系。这样就会涉及到合并操作之后,对于sum数组的更新问题,由于并查集记录的只是自己的父亲,所以想在合并的时候进行更新是行不通的,那么就只能在查询过程中进行更新了,一边查一边更新sun数组,这样保证我们用到的都是最新的结果。这里需要掌握一个距离更新算法。
这种情形下,还算是中规中矩的并查集考察,就是稍微复杂一点的并查集,做题时需要想到带权并查集就好了。参考:HDU3038,POJ1182
3.灵活应用并查集:
这个就是比较难的了,一般会在第二种应用或者第一种应用之上,加上一些技巧,甚至是和其他算法结合在一起的综合题,总之题可以非常难。比如什么倒着来了,暴力枚举了,这种题就只能靠自己的经验和聪明才智了,多想想怎么往并查集上转化。参考:POJ2912,ZOJ3261
算法优化:
并查集如同二叉搜索树一样,存在退化现象,会使得效率下降。极端情况下(一条链表),就和正常的查询没区别了。首先会想到合并时,总是将高度低的树接到高度高的上,然而并不是最好。最好的做法是路径压缩算法,在查询过程中,将所有结点顺便全部接到根结点上,这样可以大幅提高并查集的效率。