读数据结构与算法分析

不相交集合

等价关系

满足三个性质

  1. - 自反性
  2. - 对称性
  3. - 传递性

基本数据结构

基本思路

使用一个数组,下标表示该集合,内容表示指向的父亲

实现

类型声明

  1. typedef int DisjSet[NumSets + 1] ;
  2. typedef int SetType ;
  3. typedef int ElementsType ;
  4. void Intialize(DisjSet S) ;
  5. void SetUnion(DisjSet S,SetType Root1,SetType Root2) ;
  6. SetType Find(ElementType X,DisjSet S) ;

初始化

  1. void Intialize(DisjSet S)
  2. {
  3. int i ;
  4. for(i = NumSets; i > 0;i--)
  5. S[i] = 0 ;
  6. }

Union操作

不是最好的方法

  1. void Union(DisjSet S,SetType Root1,SetType Root2)
  2. {
  3. S[Root2] = Root1 ;
  4. }

Find操作

  1. SetType Find(ElementType X, DisjSet S)
  2. {
  3. if(S[X] <= 0)
  4. return X ;
  5. else
  6. return Find(S[X],S) ;
  7. }

更好的Find操作

让根节点的数组内容为高度的相反数,也就是用负数表示

  1. void SetUnion(DisjSet S,SetType Root1,SetType Root2)
  2. {
  3. if(S[Root2] < S[Root1]) //R2高
  4. S[Root1] = Roo2 ;
  5. else
  6. {
  7. if(S[Root1] == S[Root2])
  8. S[Root1]-- ;
  9. S[Root2] = Root1 ;
  10. }
  11. }

路径压缩

执行Union操作最终都会形成最坏情形的树

改进Find方法

改进的Find函数

  1. SetType Find(ElementType X,DisjSet S)
  2. {
  3. if(S[X] <= 0)
  4. return X ;
  5. else
  6. return S[X] = Find(S[X],S) ;
  7. }

不相交集合ADT -数据结构(C语言实现)的更多相关文章

  1. 不相交集合ADT

    不相交集合数据结构保持一组不相交的动态集合S={S1,S2,...,SK},每个集合通过一个代表来识别,代表即集合中的某个成员. 如果x表示一个对象,不相交集合支持以下操作: MAKE-SET(x): ...

  2. 三元组ADT (数据结构C语言版) C++实现

    很久没用C语言,都忘了C语言中没有引用参数,下面的代码中用到了C语言没有的引用参数. 首先是一些表示状态的全局变量 common.h #define TRUE 1 #define FALSE 0 #d ...

  3. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  4. 【并查集】 不相交集合 - 并查集 教程(文章作者:Slyar)

    最近写了一个多星期的并查集,一瞬间贴出这么多解题报告,我想关于并查集的应用先告一段落吧,先总结一下. 在网上看到一篇关于并查集比较好的教程(姑且允许我这么说吧),不转过来是在可惜.献给爱学习的你 文章 ...

  5. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  6. 并查集(不相交集合)详解与java实现

    目录 认识并查集 并查集解析 基本思想 如何查看a,b是否在一个集合? a,b合并,究竟是a的祖先合并在b的祖先上,还是b的祖先合并在a上? 其他路径压缩? 代码实现 结语 @(文章目录) 认识并查集 ...

  7. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  8. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  9. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

随机推荐

  1. JNI由浅入深_7_c调用Java方法一

    1.在Java中声明方法 <span style="font-size:14px;">/** * javah -encoding utf-8 -jni com.exam ...

  2. Linux Shell常用技巧(九)

    十九.  和系统运行进程相关的Shell命令:       1.  进程监控命令(ps):    要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时 ...

  3. ORA-27300: OS system dependent operation:sendmsg failed with status: 105 ORA-27301: OS failure message: No buffer space available

    早上查看数据库alert日志,发现如下ORA-报错: kgxpvfynet: mtype: 61 process 6460 failed because of a resource problem i ...

  4. 解决win10安装MySQL数据库出现服务无法启动的问题

    安装mysql的时候一直出现这个问题,在网上找了很多种方法,终于解决了这个问题. 我在官网下载的安装包解压后没有my.ini文件,需要自己添加(红字不要复制) [mysql]# 设置mysql客户端默 ...

  5. Xquery的初步学习(一次Lab作业的总结)

    Task 1: Open countries.xml, compose the following XQueries: 1. Return the area of Mongolia. 2. Retur ...

  6. Centos 下 mysql 安装过程

    1. 检查系统自带的Mysql,并卸载自带的版本 [root@iZ2366ycl7sZ config]# yum list installed |grep mysql mysql.x86_64 5.1 ...

  7. 15JavaScript switch语句

    1.JavaScript switch 语句 使用 switch 语句来选择要执行的多个代码块之一. 语法: switch(n) { case 1: 执行代码块 1 break; case 2: 执行 ...

  8. AFNetworking 2.x 的SSL身份认证

    一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探 其实这么做的话还是不够的.我们还需要防止中间人攻击(不明白的自己去 ...

  9. swiper 导航有多个,被点击的项居中显示。

    <div class="swiper-container"> <div class="swiper-wrapper"> <div ...

  10. PHP && ,and ,||,or 的区别

    PHP中的逻辑“与”运算有两种形式:AND 和 &&,同样“或”运算也有OR和||两种形式. 如果是单独两个表达式参加的运算,两种形式的结果完全相同,例如 $a AND $b和$a & ...