最近在看《Algorithms IN C》这本书,刚开始看,读的是英文版的,感觉作者的叙述有点不太容易理解,就找了一本中文版的来看,发现还是看英文版的比较好。先看了第一章的大部分,后面的总结还没有看,我的感受是,一个小的问题只需要找到一个正确的算法就可以了,根本不许要去考虑算法的效率和性能,只有在解决一些大型的实际问题时,算法的优劣才能体现出来。另外,就是增加机器的性能远不如改善算法的性能贡献大。

第一章举了一个连通性的例子,作者一步一步的引导我们来改进算法,使得这个算法最终可以真正的用在实际问题中。这个问题的描述及四个解决算法,如下:

问题描述
输入两个整数,代表两个节点,如果这两个整数没有建立连接(这包括直接连接和通过其他节点连接),那么我们就建立这两个节点之间的连接,否则,继续输入下一个节点

四个逐步改进的算法如下:

//算法一
#include <stdio.h>#define N 10int main(void)
{int id[N];int t,i,p,q;//一定要初始化啊for(i=0;i<N;i++){id[i] = i;}while( scanf("%d%d",&p,&q)==2 ){if( id[p]==id[q] )continue;t = id[p];for(i=0;i<N;i++){if( id[i]==t ){id[i] = id[q];}}for(i=0;i<N;i++){printf("%d\t",id[i]);}printf("\n");}return 0;
}

这四个算法所使用的数据结构都是数组,算法一是把连接(包括直接连接和间接连接)在一起的整数所对应的数组元素都赋值为相同的值。

//算法二
#include <stdio.h>#define N 10int main(void)
{int id[N];int i,j,p,q;for(i=0;i<N;i++){id[i] = i;}while( scanf("%d%d",&p,&q)==2 ){//必须使用下面两次循环,否则当心陷入死循环for(i=p;id[i]!=i;i=id[i]);for(j=q;id[j]!=j;j=id[j]);if( i==j )continue;id[i] = j;for(i=0;i<N;i++){printf("%d\t",id[i]);}printf("\n");}return 0;
}

算法二采用的数据结构仍然是数组,但是逻辑上确实树的结构。我们首先根据输入的两个整数,分别找到其所在的树的根节点,然后检测两个节点所在的树的根节点是否相同,如果相同,就说明是同一棵树,否则就把这两个根节点连接起来。

//算法三
#include <stdio.h>#define N 10int main(void)
{int id[N],sz[N];int p,q,i,j;for(i=0;i<N;i++){id[i] = i;sz[i] = 1;} while( scanf("%d%d",&p,&q)==2 ){for(i=p;id[i]!=i;i=id[i]);for(j=q;id[j]!=j;j=id[j]);if( sz[i]<sz[j] ){id[i] = j;sz[j] += sz[i];}else{id[j] = i;sz[i] += sz[j];}printf("i=%d\nj=%d\n",i,j);for(i=0;i<N;i++){printf("%d\t",sz[i]);}printf("\n");for(i=0;i<N;i++){printf("%d\t",id[i]);}printf("\n");}return 0;
}

算法三是在算法二的基础之上改进而来的,但是它添加了一个数据结构,记录以每个节点为根的树中的元素的个数。通过这个数据结构,每次都把小树连接到大树上,防止树的深度过深。

//算法四
#include <stdio.h>#define N 10int main(void)
{int id[N];int sz[N];int p,q,i,j;//初始化for(i=0;i<N;i++){id[i] = i;sz[i] = 1;}while( scanf("%d%d",&p,&q)==2 ){for(i=p;id[i]!=i;i=id[i]){id[i] = id[id[i]];}for(j=q;id[j]!=j;j=id[j]){id[j] = id[id[j]];}if( sz[i]<sz[j] ){id[i] = j;sz[j] += sz[i];} else{id[j] = i;sz[i] += sz[j];}printf("i=%d\nj=%d\n",i,j);for(i=0;i<N;i++){printf("%d\t",sz[i]);}printf("\n");for(i=0;i<N;i++){printf("%d\t",id[i]);}printf("\n");}return 0;
}

算法四就是在算法三的基础之上又做了进一步的改进,将树的深度进一步的缩小。

关于第二章算法分析的部分,准备留到以后再看,现在看了没什么深得体会,下一部分,准备开始看数据结构。

连通性问题--Algorithms IN C读书笔记相关推荐

  1. 《Deep Learning With Python second edition》英文版读书笔记:第十一章DL for text: NLP、Transformer、Seq2Seq

    文章目录 第十一章:Deep learning for text 11.1 Natural language processing: The bird's eye view 11.2 Preparin ...

  2. 《Effective C++》读书笔记(第一部分)

    有人说C++程序员可以分为两类,读过Effective C++的和没读过的.世界顶级C++大师Scott Meyers 成名之作的第三版的确当得起这样的评价. 本书并没有你告诉什么是C++语言,怎样使 ...

  3. PMP读书笔记(第11章)

    大家好,我是烤鸭:     今天做一个PMP的读书笔记. 第十一章 项目风险管理 项目风险管理 项目风险管理的核心概念 项目风险管理的趋势和新兴实践 裁剪考虑因素 在敏捷或适应型环境中需要考虑的因素 ...

  4. c++矩阵转置_lt;读书笔记4gt; 稀疏矩阵基础算法

    本篇为稀疏矩阵求解算法经典论著<Direct Methods for Sparse Linear System>的<读书笔记 4> Chapter 2 Basic algori ...

  5. The Pragmatic Programmer 读书笔记之中的一个 DRY-Don’t Repeat Youself

     The Pragmatic Programmer读书笔记之中的一个 DRY-Don't Repeat Youself 尽管自己买了非常多软件project方面的书,可是由于时间的问题.一直没有静 ...

  6. 读书笔记——数据压缩入门(柯尔特·麦克安利斯)中

    文章目录 数据压缩入门汇总 第六章 自适应统计编码 6.1 位置对熵的重要性 6.2 自适应VLC编码 6.2.1 动态创建VLC表 6.2.2 字面值 6.2.3 重置 6.2.4 何时重置 6.3 ...

  7. 读书笔记:云计算概念、技术和架构

    最近开始看之前买了好久的书<云计算概念.技术和架构>,最近公司和部门都在紧锣密鼓地推动云计算在生产运维中部署落地,未来的五年规划更是围绕云计算进行铺开,在这个背景下实在有必要多啃几本关于云 ...

  8. 《算法图解》读书笔记—像小说一样有趣的算法入门书

    前言 学习算法课程的时候,老师推荐了两本算法和数据结构入门书,一本是<算法图解>.一本是<大话数据结构>,<算法图解>这本书最近读完了,读完的最大感受就是对算法不再 ...

  9. 《数字图像处理》读书笔记2:数字图像处理基础

    <数字图像处理>读书笔记2:数字图像处理基础 1 人类视觉感知 1.1 眼睛构造图 1.2 基本概念: 1.2.1 亮度适应(Brightness Adaptation) 1.2.2 主观 ...

最新文章

  1. 专访陈天桥:把钱投给甘坐冷板凳的AI研究员
  2. OpenCV Resize Reshape
  3. c51单片机跑马灯汇编语言,单片机跑马灯汇编程序 单片机汇编程序编写技巧
  4. 访问不上服务器的任何端口
  5. ubuntu 下更新pip后发生 ImportError: cannot import name 'main'的问题解决
  6. 统计学——单(双)因素方差分析
  7. 代数结构在计算机科学中的应用,代数结构
  8. estore简版商城思路
  9. SLIC——算法详细分析及代码
  10. 美国计算机编程竞赛,USACO美国计算机竞赛
  11. CCNA学习笔记7--动态路由协议概念和RIP
  12. Oracle数据库如何保存中文特殊字符到数据库表中,防止出现问号
  13. 中国酒店周刊 | 华尔道夫、宜必思、格兰云天新店开业
  14. 水经注CAD智能影像加载插件使用教程
  15. 计算机学识水平自我评价,计算机毕业自我鉴定范文
  16. 计算机课听后评课稿,教师听课反思(评课记录)
  17. nacos和eruka的区别
  18. CentOS7 U盘安装
  19. 第4章 控制执行流程
  20. 超链接的伪类及如何清除缓存

热门文章

  1. [转载] 重新抛出异常与 public Throwable fillInStackTrace()
  2. ESP分区重建,解决各种引导问题
  3. word2vec 在 非 自然语言处理 (NLP) 领域的应用
  4. Ubuntu 12.04下Pomelo开发环境搭建(转)
  5. APICloud学习笔记之div样式设置套路
  6. 【SSH】 之 Struts2
  7. 开放源码的.NET 反编译工具 .NET IL调试工具 学习微软中间语言(MSIL)的绝佳工具 Dotnet IL Editor 推荐...
  8. 20款超酷的404错误页面(上)
  9. Linux 下安装Eclipse C++
  10. C++ Primer Plus学习(二)—— 基本编程技能