//从今天起准备认真看完这本书。本渣虽然笨,但是窝懒啊。。。。

//今天开始看第一章。希望坚持下去。

第一章 引言

通过讨论连通问题的几种算法,来引出算法的重要性。

1.1 连通问题的快速查找算法

感觉就是把每个点染色,每个颜色代表一堆,互相连通。每次输入两个点,把两个点所属那个颜色改为相同,这样他们代表就都互相连通。

时间复杂度:O(MN), M是输入指令次数,N是点个数

//1.1 连通问题的快速查找算法
#include <stdio.h>#define N 10int id[N];                          // 表示每个点的色int main()
{//freopen("in.txt", "r", stdin);int i, t, p, q;for (i = 0; i < N; ++i)id[i] = i;                  // 开始每两个点都不连通,所以每个点一个颜色while (scanf("%d%d", &p, &q) == 2) {if (id[p] != id[q]) {for (t = id[p], i = 0; i < N; ++i)if (id[i] == t)     // 把所有和p一个颜色的点染成q的颜色id[i] = id[q];}for (i = 0; i < N; ++i)printf("%d ", id[i]);printf("\n");}return 0;
}

1.2 连通问题的快速合并解法

就是两个点相同就把两个点放到同一棵树上,这样两个点根相同代表他们连通。每次找到两个点的根,如果不相同,就把一个跟连到另一个根上。

时间复杂度:O(MN),M是输入指令次数,N是点个数。当M>N时,执行次数为MN/2

//1.2 连通问题的快速合并算法#include <stdio.h>#define N 10int main()
{//freopen("in.txt", "r", stdin);int i, j, p, q;int id[N];                      // 表示每个点的父节点for (i = 0; i < N; ++i)id[i] = i;                  // 开始每两个点都不连通,所以每个点的父节点是自己while (scanf("%d%d", &p, &q) == 2) {for (i = p; i != id[i]; i = id[i])/*nothing*/ ;           // 当该节点的父节点与该节点相等时,证明该节点是根for (j = q; j != id[j]; j = id[j])/*nothing*/ ;if (i != j)                 //此时i为p的根,j为q的根id[i] = j;for (i = 0; i < N; ++i)printf("%d ", id[i]);printf("\n");}return 0;
}

1.3 加权快速合并算法

记录每棵树的节点个数,把节点少的根连到节点多的根。

时间复杂度:lgN。每次找一个节点的根只需要lgN,因为1+lgi=lg2+lgi=lg(2i)=lg(i+i)<=lg(i+j)

//1.3 加权快速合并算法
#include <stdio.h>#define N 10int main()
{freopen("in.txt", "r", stdin);int i, j, p, q;int id[N];                      // 表示每个点的父节点int sz[N];                      // 每棵树的节点个数for (i = 0; i < N; ++i) {id[i] = i;                  // 开始每两个点都不连通,所以每个点的父节点是自己sz[i] = 1;                  // 开始每个节点一棵树}while (scanf("%d%d", &p, &q) == 2) {for (i = p; i != id[i]; i = id[i])/*nothing*/ ;           // 当该节点的父节点与该节点相等时,证明该节点是根for (j = q; j != id[j]; j = id[j])/*nothing*/ ;           //此时i为p的根,j为q的根if (i != j && sz[i] < sz[j]) {//当j所在树节点多,就把i连j上id[i] = j;sz[j] += sz[i];} else if (i != j) {id[j] = i;sz[i] += sz[j];}for (i = 0; i < N; ++i)printf("%d ", id[i]);printf("\n");}return 0;
}

1.4 等分路径压缩

在查找根的过程中,使沿路每个节点的id指向根。 

时间复杂度:接近O(n)?

//1.4 等分路径压缩
#include <stdio.h>#define N 10
int main()
{//freopen("in.txt", "r", stdin);int i, j, p, q;int id[N];                      // 表示每个点的父节点int sz[N];                      // 每棵树的节点个数for (i = 0; i < N; ++i) {id[i] = i;                  // 开始每两个点都不连通,所以每个点的父节点是自己sz[i] = 1;                  // 开始每个节点一棵树}while (scanf("%d%d", &p, &q) == 2) {for (i = p; i != id[i]; i = id[i]) {//printf("id[%d]=%d, id[id[%d]]=%d\n", i, id[i], i, id[id[i]]);id[i] = id[id[i]];      // --------①--------}for (j = q; j != id[j]; j = id[j])id[j] = id[id[j]];if (i != j && sz[i] < sz[j]) {id[i] = j;sz[j] += sz[i];} else if (i != j) {id[j] = i;sz[i] += sz[j];}for (i = 0; i < N; ++i)printf("%d ", id[i]);printf("\n");}return 0;
}

说一下窝对①处的理解。

如果该节点为根节点或深度为2,即

则不改变。

如果深度为3,则

->

深度为4

->

深度为5

深度为6

这样每个节点的深度小了。搜索根节点的复杂度变小。(然而我觉得并没有什么卵用。。。。)

转载于:https://www.cnblogs.com/wenruo/p/4602222.html

《算法:C语言实现》阅读笔记相关推荐

  1. trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer

    一.代码结构概览 1.核心部分 configs:储存各种网络的yaml配置文件 datasets:存放数据集的地方 detectron2:运行代码的核心组件 tools:提供了运行代码的入口以及一切可 ...

  2. VoxelNet阅读笔记

    作者:Tom Hardy Date:2020-02-11 来源:VoxelNet阅读笔记

  3. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  4. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  5. Mina源码阅读笔记(一)-整体解读

    2019独角兽企业重金招聘Python工程师标准>>> 今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者 ...

  6. “CoreCLR is now Open Source”阅读笔记

    英文原文:CoreCLR is now Open Source 阅读笔记如下: CoreCLR是.NET Core的执行引擎,功能包括GC(Garbage Collection), JIT(将CIL代 ...

  7. QCon 2015 阅读笔记 - 团队建设

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 中西对话:团队管理的五项理论和实战 - 谢欣.董飞(今日头条,LinkedI ...

  8. 05《软件需求模式》阅读笔记

    剩下的两个阅读笔记写第二部分.各类需求模式,共八个领域和它的需求模式,这一次写前四个. 基础需求模式,它是所有种类的系统都可能需要的一些东西.系统间接口需求模式使用系统间接口需求模式定义被定义的系统和 ...

  9. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  10. 大型网站技术架构:核心原理与案例分析阅读笔记二

    大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...

最新文章

  1. TensorFlow基础剖析
  2. Linux 常用小技巧
  3. Spark组件和术语定义
  4. 【Flutter】Dart 数据类型 字符串类型 ( 字符串定义 | 字符串拼接 | 字符串 API 调用 )
  5. 离线轻量级大数据平台Spark之JavaRDD关联join操作
  6. Python3 strip()去除字符串首尾指定信息
  7. 2015年 第6届 蓝桥杯 Java B组 省赛解析及总结
  8. js中document.documentElement 和document.body 以及其属性 clientWidth等
  9. 引用dll文件要复制到本地
  10. 一个类中有一个参数,需要在另一个类中用到
  11. 有时我都非常讨厌自己,特别容易相信人
  12. 服务器小白-MYSQL基础安装配置
  13. 微信小程序demo汇总
  14. 个人介绍网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  15. android跳转界面的方法有多少,Android跳转WIFI界面的四种方式
  16. visual studio安装vsix插件
  17. 迅雷手机版苹果版_2020最新迅雷苹果版如何下载?
  18. encapsulation dot1q vlan-id命令
  19. Clickhouse MergeTree系列(Replacing、Summing等)表引擎使用说明
  20. 摄像头录像时出现连接错误

热门文章

  1. SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引
  2. JavaScript 开发者经常忽略或误用的七个基础知识点
  3. 火车票放票时间 潜规则
  4. jquery Demo 以及code
  5. Delphi - 注入的方式来禁止任务管理器
  6. git clone大文件EOF错误
  7. String 转Clob
  8. mysql 中的 engine 存储引擎
  9. 回顾:你对Windows 8了解有多少?开启浏览器javascr
  10. Silverlight 2 跨域访问控件与WebService的资料整理