不相交集是一种用于描述等价问题的有效的数据结构,它的实现非常简单。对于一个不相交集的操作只有两种,一种合并操作,将两个集合合并为一个等价问题,另一种便是find,它返回的是给定元素的集合的名字。
对于不相交集我们用一个数组来实现即可,每个数组元素的下标代表着这个元素的值,而数组内的具体内容则是其指向的父节点。每个等价集合都会有一个最终的根节点,它无需再指向谁,这时一种做法是,我们在里面放置一个负值,负值的绝对值代表着这个等价集的深度。这样我们再合并两个等价集的时候便可以将深度小的集合合并到大的里面去,这样可以优化算法性能。
一个不相交集以及相关操作函数的申明可以是这样的:
typedef int * disjoint_set;
typedef int set_type;
typedef int element_type;
void init(disjoint_set);
void set_union(disjoint_set s,set_type root1,set_type root2);
void find(element_type x,disjoint_set s);
为了直观起见,我们给了int三个别名。一个不相交集的操作有三个,第一个是初始化,第二个是合并,第三个是查找。注意的是需要预先给出大小,将dijoint_set的空间申请好。
不相交集的初始化操作是这样的:
void init(disjoint_set s)
{
int i;
for(i=num_of_sets;i>0;i--)
s[i]=0;
}
我们将数组内的元素都赋值为零,