并查集-----集合以及计算----

集合的表示

  集合运算:交 , 差 , 并 , 补 , 判定一个元素是否属于某一集.?

  并查集:  集合 并 , 查 某元素属于什么集合?

  并查集问题中集合储存如何实现?

        可以 用 树结构

 

 

/*先找  需要寻找元素的X的位置*/
int
Find( SetType S[ ], ElementType X )//在数组S中查找 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 中的下标 */ }
  /*找到X之后我们开始去她的祖先,最后我们返回的是需要寻找元素的祖先.*/

 ------------------下面开始并运算------------------------------------

    分别找到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;
}

 

为了改善合并以后树的高度,我们可以将小的集合合并到相对打的集合中.

 

 

 

-----------------------终于结束了------------下面就要开始图了------我想陈越阿姨了------

 

转载于:https://www.cnblogs.com/A-FM/p/5148231.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值