集合的表示
- 集合运算:
交、并、补、差,判定
一个元素是否属于某一集合 并查集
:集合并、查
某元素属于什么集合- 可以用树结构表示集合,树的每个结点代表一个集合元素
集合运算
(1)查找某个元素所在的集合(用根结点表示)
int Find(SetType S[], Elemtype X)
{ //在数组S中查找值为X的元素所属的集合
//MaxSize是全局变量,为数组S的最大长度
int i;
for (i = 0; i < MaxSize && 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中的下标
}
(2) 集合的并运算
- 分别找到X1和X2两个元素所在集合树的根结点;
- 如果它们不同根,则将其中一个根结点的父结点指针设置成另一个根结点的数组下标。
void Union(SetType S[], Elemtype X1, Elemtype X2)
{
int Root1, Root2;
Root1 = Find(S, X1);
Root2 = Find(S, X2);
if(Root1!= Root2)
S[Root2].Parent = Root1;
}
为了不让树的高度增加的太快,将较小的集合合并到较大的集合中。根结点的parent的绝对值表示该集合元素的数量