【数据结构】集合及运算

£神魔★判官ぃ 2024-04-17 05:53 165阅读 0赞

集合的表示

集合运算:交、并、补、差,判定一个元素是否属于某一集合
并查集:集合并、查某元素属于什么集合
在这里插入图片描述

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

可以用树结构表示集合,树的每个结点代表一个集合元素
在这里插入图片描述

采用数组存储形式
在这里插入图片描述

集合运算

(1)查找某个元素所在的集合(用根结点表示)

  1. int Find( SetType S[ ], ElementType X )
  2. { /* 在数组S中查找值为X的元素所属的集合 */
  3. /* MaxSize是全局变量,为数组S的最大长度 */
  4. int i;
  5. for ( i=0; i < MaxSize && S[i].Data != X; i++) ;
  6. if( i >= MaxSize ) return -1; /* 未找到X,返回-1 */
  7. for( ; S[i].Parent >= 0; i = S[i].Parent ) ;
  8. return i; /* 找到X所属集合,返回树根结点在数组S中的下标 */
  9. }

(2)集合的并运算

分别找到X1和X2两个元素所在集合树的根结点
如果它们不同根,则将其中一个根结点的父结点指针设置成另一个根结点的数组下标。

  1. void Union( SetType S[ ], ElementType X1, ElementType X2 )
  2. {
  3. int Root1, Root2;
  4. Root1 = Find(S, X1);
  5. Root2 = Find(S, X2);
  6. if Root1 != Root2 S[Root2].Parent = Root1;
  7. }

为了改善合并以后的查找性能,可以采用小的集合合并到相对大的集合中。(修改Union函数)
在这里插入图片描述

  1. #define MAXN 1000 /* 集合最大元素个数 */
  2. typedef int ElementType; /* 默认元素可以用非负整数表示 */
  3. typedef int SetName; /* 默认用根结点的下标作为集合名称 */
  4. typedef ElementType SetType[MAXN]; /* 假设集合元素下标从0开始 */
  5. void Union( SetType S, SetName Root1, SetName Root2 )
  6. { /* 这里默认Root1和Root2是不同集合的根结点 */
  7. /* 保证小集合并入大集合 */
  8. if ( S[Root2] < S[Root1] ) { /* 如果集合2比较大 */
  9. S[Root2] += S[Root1]; /* 集合1并入集合2 */
  10. S[Root1] = Root2;
  11. }
  12. else { /* 如果集合1比较大 */
  13. S[Root1] += S[Root2]; /* 集合2并入集合1 */
  14. S[Root2] = Root1;
  15. }
  16. }
  17. SetName Find( SetType S, ElementType X )
  18. { /* 默认集合元素全部初始化为-1 */
  19. if ( S[X] < 0 ) /* 找到集合的根 */
  20. return X;
  21. else
  22. return S[X] = Find( S, S[X] ); /* 路径压缩 */
  23. }

发表评论

表情:
评论列表 (有 0 条评论,165人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据的表示运算

    该部分主要时知识大纲的梳理,可能会与很多部分知识点并不详细(主要是为了考察初级软考知识的储备是否充分~) 一、数据的表示 计算机中常见的数制有: 二进制B 0,1,1

    相关 数据结构集合

    集合是不同对象(称为成员)的无序聚集。集合是成员彼此之间相关,但每个成员在集合中只出现一次的无序聚集。集合的两个特点: 成员是无序的 每个成员都只在集合中出现一次

    相关 数据结构与算法--位运算

    位运算 记得大学编译原理刚开始面对的就是机器语言,而位运算就是讲数字用二进制标识后,对每一位上的0, 或者1 进行运算。二进制以及位运算都是计算机学科的基础,很多底

    相关 集合数据结构总结

     List  有序集合 ArrayList 结构:采用数组结构,查询性能优秀(数组将元素在内存中连续存放,链表非顺序存放),插入以及删除性能较差(插入以及删除都会