Disjoint Set - 并查集


并查集

拥有个元素的集合分为两个家庭。每个家族只有唯一一个祖先,相同家庭的元素拥有相同的祖先。因此集合中的每个元素的祖先只有种可能。并查集是一种适合元素分类的高效树形数据结构,支持快速分类和查询。

的父节点,设的祖先节点。当时称为祖先节点。

对于拥有个成员的集合,将其分成两个家庭。初始时令每个成员的父亲都是自己,如图所示:

DisjointSet1.png

当声明个成员)属于同一家庭,令的节点祖先为的父亲(也可以反过来),即。这样的操作会使元素更接近祖先节点,从而缩短了递归向上查找的路径长度,该操作也称为压缩路径。

下面对上图中的集合进行具体演示:

声明属于同一家庭,设置

DisjointSet2.png

声明节点属于同一家庭,设置

DisjointSet3.png

声明节点属于同一家庭,设置

DisjointSet4.png

声明节点属于同一家庭,设置

DisjointSet5.png

声明节点属于同一家庭,设置

DisjointSet6.png

声明节点属于同一家庭,设置

DisjointSet7.png

声明节点属于同一家庭,设置

DisjointSet8.png

声明节点属于同一家庭,设置

DisjointSet9.png

合并两节点时,根据固定规则设置(或者相反);查询节点的祖宗节点时,若则设置。并查集的分类、查询操作的时间复杂度接近


源码

DisjointSet.h

DisjointSet.cpp

测试

DisjointSetTest.cpp