【数据结构笔记19】File Transfer的C语言实现,集合的简化表示,按秩归并,路径压缩
本次笔记内容:
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语言实现,集合的简化表示,按秩归并,路径压缩相关推荐
- java静态链表_数据结构笔记:静态链表(C语言)
void CreateList(StaticLinkList *P)//创建一个静态链表 { int i; for(i=0;i此时并没有已占用空间,所以第一个节点中的指针(cur)的值为1,也就是说空 ...
- Linux学习笔记19——XFS 文件系统的备份与还原、光盘写入工具、其他常见的压缩与备份工具
目录 一.XFS 文件系统的备份与还原 1,XFS 文件系统备份 xfsdump 用 xfsdump 备份完整的文件系统 用 xfsdump 进行累积备份 (Incremental backups) ...
- 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...
树型分布网络信号放大器 森林和二叉树的相互转换 并查集 例题:File transfer #include <iostream> using namespace std; //typede ...
- Python学习笔记19:列表 III
Python学习笔记19:列表 III 其实这篇笔记标题应该是列表扩展,从列表开始,将涵盖Python中的序列容器. 关于列表的基础知识,可以看我的前两篇文章: Python学习笔记1:列表. Pyt ...
- 数据结构与算法入门教程(C语言实现版)
个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 C语言数据结构与算法 BF和 ...
- r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数
在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...
- 浙大2020年Mooc数据结构笔记--第三讲 树(下)
浙大2020年Mooc数据结构笔记–第三讲 树(下) 〇.前言 这几天开始跟着学数据结构,鉴于当初数据结构实在学的太弱,加之这项工作算是为大家之后复习.机试铺路.确实是一个迫切需要做的大规模工作.行胜 ...
- 吉大c 语言程序设计奥鹏作业,吉大19秋学期《C语言程序设计》在线作业一【满分答案】...
吉大19秋学期<C语言程序设计>在线作业一题目 试卷总分:100 得分:100 一.单选题 (共 10 道试题,共 40 分) 函数 rewind 的作用是 A.将文件位置指针指向文件中 ...
- File Transfer(并查集)
题目大意:将多个电脑通过网线连接起来,不断查询2台电脑之间是否连通. 问题来源:中国大学mooc 05-树8 File Transfer (25 分) We have a network of com ...
最新文章
- java多线程w3c_Java创建多线程的三种方式
- 网页开发 与数据联动的图_零基础学习数据可视化pyecharts人物关系图开发
- 学术 科研 论文写作 生物信息学
- android 左移动画_android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上...
- git merge用法_Git 基本命令 merge 和 rebase,你真的了解吗?
- python sql逐行读取数据库数据,使用python读取数据库中的内容 把爬虫爬到的内容,存储在mysql数据库中...
- 25条提高iOS App性能的建议和技巧
- 转载(Asp.net Core 中试使用ZKWeb.System.Drawing)
- 大学C语言各章节练习题_及答案合集【350题】《选择题- 判断-程序填空-程序设计》
- 电力系统微型计算机继电保护试题及答案,a全p国2010年7月高等教育自学考试电力系统微型计算机继电保护试题及答案.doc...
- 广东联通光猫wo-27s华为HG8321R超级密码
- ssis 抽取mysql 实验_SSIS探索之SSIS增量抽取数据
- osgEarth的Rex引擎原理分析(一二二)着色器程序的opengl过程
- 通过注册表禁用系统服务
- android热成像模块,Thermal Camera
- 计算机科学与技术考研吧,计算机科学与技术考研学校排名
- Errors were encountered while processing(Ubuntu系统报错)
- 【oracle报错】ORA-28000
- 最强卸载神器,使你的Windows绝对干净
- 亲缘进程、非亲缘进程-共享内存与信号
热门文章
- ORACLE数据库多表关联查询效率问题解决方案
- Sublime Text 支持GBK , 解决中文乱码问题
- Java检查异常、非检查异常、运行时异常、非运行时异常的区别
- 【明哥报错簿】之 mybatis异常invalid comparison: java.util.Date and java.lang.String
- 我可以获得标记为--assume-unchanged的文件列表吗?
- 如何在div中垂直对齐图像
- 使用windows 10 安装中文版语言
- pg日期转周_PostgreSQL的时间/日期函数使用
- mysql错误代码1怎样解决_打开网页提示mysql发生错误,错误号1194,请问下该怎么解决? 爱问知识人...
- C语言将raw转为bmp,RAW格式数据转BMP格式数据