集合的表示
集合运算:交、并、补、差、判定一个元素是否属于某一集合
并查集:集合并、查某元素属于什么集合
并查集问题中集合存储如何实现?
可以用树结构表示集合、树的每一个结点代表一个结合元素,树根代表这个集合
采用数组存储形式表示
查找集合
查找某个元素所在的集合(用根结点表示)
int Find (SetType S[] ,ElementType X)
{
/*在数组S中查找值为X的元素所属的集合*/
/*MaxSize是全局变量,为数组S的最大长度*/
int i;
for(i=0;i<MaxSzie&&S[i].Data!=X;i++)
if(i>=MaxSize) return -1;/*未找到X,返回-1*/
for(;S[i].Parent>=0;i=S[i].Parent);
return i;/*找到 X所属集合,返回树根结点在数组S中的下标*/
}
集合的并运算
分别找到X1和X2两个元素所在集合树的根结点
如果它们不同根,则将其中一个根结点的父结点指针设置成另外一个根结点的数组下标。
void Union( SetType S[],ElementType X1,ElementType X2)
{
int Root1,Root2;
Root1=Find(S,X1);
Root2=Find(S,X2);
if(Root1!=Root2) S[Root2].Parent=Root1;
}
①为了改善合并后查找性能,可以采用将小的集合合并到相对大的集合中去(修改Union函数),修改数组中Parent的值