本次笔记内容:
File Transfer - C语言实现(4小节共42:43)

文章目录

  • 集合的简化表示
  • 题意理解与实现
    • 题目与样例
    • 程序框架
    • 简单实现Find与Uion函数
    • 按秩归并改进Union()
      • 按高度归并
      • 按规模归并
    • 路径压缩改进Find()
    • 路径压缩时间复杂度数学属性

集合的简化表示

如上图,在元素可被映射到坐标的情况下,可以去掉结构体中的数据域。使用下标代表元素,S代表其父结点指向的存储方法,实现如下:

typedef int ElementType; /* 默认元素可以用非负整数表示 */
typedef int SetName;     /* 默认用根结点的下标作为集合名称 */
typedef ElementType SetType[MaxSize];SetName Find(SetType S, ElementType X)
{ /* 默认集合元素全部初始化为-1 */for (; S[X] >= 0; X = S[X]);return X;
}void Union(SetType S, SetName Root1, SetName Root2)
{ /* 这里默认Root1和Root2是不同集合的根结点 */S[Root2] = Root1;
}

题意理解与实现

题目与样例

如上图,5代表5台计算机,C代表Check,此时没有计算机连通,因此C 3 2后输出no(3与2之间没有连通);I代表Input,I 3 2代表连通3和2,以此类推。

程序框架

int main(){初始化集合;do {读入一条指令;处理指令;} while(没结束);return 0;
}

具体实现如下。

int main()
{SetType S;int n;char in;scanf("%d\n", &n);Initialization(S, n);do{scanf("%c", &in); // 取第一个字符switch (in){case 'I':Input_connection(S);break; // Union(Find)case 'C':Check_connection(S);break; // Findcase 'S':Check_network(S, n);break; // 数集合的根}} while (in != 'S');return 0;
}

每个函数的具体实现如下。

void Input_connection(SetType S)
{ElementType u, v;SetName u, v;SetName Root1, Root2;scanf("%d %d\n", &u, &v);Root1 = Find(S, u - 1);Root2 = Find(S, v - 1);if (Root1 != Root2)Union(S, Root1, Root2);
}
void Check_connection(SetType S)
{ElementType u, v;SetName Root1, Root2;scanf("%d %d\n", &u, &v);Root1 = Find(S, u - 1);Root2 = Find(S, v - 1);if (Root1 == Root2)printf("yes\n");elseprintf("no\n");
}
void Check_network(SetType S, int n)
{int i, counter = 0;for (i = 0; i < n; i++){if (S[i] < 0)counter++;}if (counter == 1)printf("The network is connected.\n");elseprintf("There are &d components.\n", counter);
}

简单实现Find与Uion函数

如上图,无论是S[Root2]=Root1;还是S[Root1]=Root2;,都存在运行超时的现象。

因此这个方法还是TSSN(Too Simple, Sometimes Naive)。

按秩归并改进Union()

如上图,使用TSSN算法,树越长越高,Find()每次都要搜索一次树,时间复杂度是n^2。

按高度归并

如上图,如果不想让树越来越高,则应该把矮树贴到高树上,因此将树的高度存在S[Root]=-树高。

void Union(SetType S, SetName Root1, SetName Root2)
{if (S[Root2] < S[Root1])S[Root1] = Root2;else{if (S[Root1] == S[Root2])S[Root1]--;S[Root2] = Root1;}
}
按规模归并

如上图,将大树贴到小树上。

void Union(SetType S, SetName Root1, SetName Root2)
{if (S[Root2] < S[Root1]){S[Root2] += S[Root1];S[Root1] = Root2;}else{S[Root1] += S[Root2];S[Root2] = Root1;}
}

以上两种方法统称为“按秩归并”。

如果一直是按秩归并,最坏情况下树高为O(logN)O(logN)O(logN)。

路径压缩改进Find()

如上图,使用路径压缩算法。在第一次对S[]使用路径压缩时,耗时较长,因为其把所有经过的结点都贴在了根结点上。之后再次对S[]使用Find()时,耗时可能较短,因为已经有一部分结点被贴在了根结点上。

SetName Find(SetType S, ElementType X)
{if (S[X] < 0) /* 找到集合的根 */return X;elsereturn S[X] = Find(S, S[X]);// 先找到根;把根变成X的父结点;再返回根
}

上述的递归是尾递归,很容易即转换为循环实现。编译器编译时,自动将尾递归转变为循环进行编译,对空间占有率不会过高。

路径压缩时间复杂度数学属性

如上图,N足够大(10^6)时,路径压缩的优势得以显现。

但是,在这种情况下,如果使用c++实现非路径压缩算法,java实现路径压缩算法,c++依然比java快。因为java读入写出数据慢。

【数据结构笔记19】File Transfer的C语言实现,集合的简化表示,按秩归并,路径压缩相关推荐

  1. java静态链表_数据结构笔记:静态链表(C语言)

    void CreateList(StaticLinkList *P)//创建一个静态链表 { int i; for(i=0;i此时并没有已占用空间,所以第一个节点中的指针(cur)的值为1,也就是说空 ...

  2. Linux学习笔记19——XFS 文件系统的备份与还原、光盘写入工具、其他常见的压缩与备份工具

    目录 一.XFS 文件系统的备份与还原 1,XFS 文件系统备份 xfsdump 用 xfsdump 备份完整的文件系统 用 xfsdump 进行累积备份 (Incremental backups) ...

  3. 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...

    树型分布网络信号放大器 森林和二叉树的相互转换 并查集 例题:File transfer #include <iostream> using namespace std; //typede ...

  4. Python学习笔记19:列表 III

    Python学习笔记19:列表 III 其实这篇笔记标题应该是列表扩展,从列表开始,将涵盖Python中的序列容器. 关于列表的基础知识,可以看我的前两篇文章: Python学习笔记1:列表. Pyt ...

  5. 数据结构与算法入门教程(C语言实现版)

    个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 C语言数据结构与算法 BF和 ...

  6. r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数

    在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...

  7. 浙大2020年Mooc数据结构笔记--第三讲 树(下)

    浙大2020年Mooc数据结构笔记–第三讲 树(下) 〇.前言 这几天开始跟着学数据结构,鉴于当初数据结构实在学的太弱,加之这项工作算是为大家之后复习.机试铺路.确实是一个迫切需要做的大规模工作.行胜 ...

  8. 吉大c 语言程序设计奥鹏作业,吉大19秋学期《C语言程序设计》在线作业一【满分答案】...

    吉大19秋学期<C语言程序设计>在线作业一题目 试卷总分:100  得分:100 一.单选题 (共 10 道试题,共 40 分) 函数 rewind 的作用是 A.将文件位置指针指向文件中 ...

  9. File Transfer(并查集)

    题目大意:将多个电脑通过网线连接起来,不断查询2台电脑之间是否连通. 问题来源:中国大学mooc 05-树8 File Transfer (25 分) We have a network of com ...

最新文章

  1. java多线程w3c_Java创建多线程的三种方式
  2. 网页开发 与数据联动的图_零基础学习数据可视化pyecharts人物关系图开发
  3. 学术 科研 论文写作 生物信息学
  4. android 左移动画_android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上...
  5. git merge用法_Git 基本命令 merge 和 rebase,你真的了解吗?
  6. python sql逐行读取数据库数据,使用python读取数据库中的内容 把爬虫爬到的内容,存储在mysql数据库中...
  7. 25条提高iOS App性能的建议和技巧
  8. 转载(Asp.net Core 中试使用ZKWeb.System.Drawing)
  9. 大学C语言各章节练习题_及答案合集【350题】《选择题- 判断-程序填空-程序设计》
  10. 电力系统微型计算机继电保护试题及答案,a全p国2010年7月高等教育自学考试电力系统微型计算机继电保护试题及答案.doc...
  11. 广东联通光猫wo-27s华为HG8321R超级密码
  12. ssis 抽取mysql 实验_SSIS探索之SSIS增量抽取数据
  13. osgEarth的Rex引擎原理分析(一二二)着色器程序的opengl过程
  14. 通过注册表禁用系统服务
  15. android热成像模块,Thermal Camera
  16. 计算机科学与技术考研吧,计算机科学与技术考研学校排名
  17. Errors were encountered while processing(Ubuntu系统报错)
  18. 【oracle报错】ORA-28000
  19. 最强卸载神器,使你的Windows绝对干净
  20. 亲缘进程、非亲缘进程-共享内存与信号

热门文章

  1. ORACLE数据库多表关联查询效率问题解决方案
  2. Sublime Text 支持GBK , 解决中文乱码问题
  3. Java检查异常、非检查异常、运行时异常、非运行时异常的区别
  4. 【明哥报错簿】之 mybatis异常invalid comparison: java.util.Date and java.lang.String
  5. 我可以获得标记为--assume-unchanged的文件列表吗?
  6. 如何在div中垂直对齐图像
  7. 使用windows 10 安装中文版语言
  8. pg日期转周_PostgreSQL的时间/日期函数使用
  9. mysql错误代码1怎样解决_打开网页提示mysql发生错误,错误号1194,请问下该怎么解决? 爱问知识人...
  10. C语言将raw转为bmp,RAW格式数据转BMP格式数据