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

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

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

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

//算法一
#include <stdio.h> #define N 10 int 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 10 int 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 10 int 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 10 int 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. 《Algorithms Unlocked》读书笔记1——循环和递归

    <Algorithms Unlocked>是 <算法导论>的合著者之一 Thomas H. Cormen 写的一本算法基础. 书中没有涉及编程语言,直接用文字描述算法,我用 J ...

  2. 《Algorithms Unlocked》读书笔记2——二分查找和排序算法

    <Algorithms Unlocked>是 <算法导论>的合著者之一 Thomas H. Cormen 写的一本算法基础,算是啃CLRS前的开胃菜和辅助教材.如果CLRS的厚 ...

  3. 《algorithms Unlocked》读书笔记3——计数排序

    <Algorithms Unlocked>是 <算法导论>的合著者之一 Thomas H. Cormen 写的一本算法基础,算是啃CLRS前的开胃菜和辅助教材.如果CLRS的厚 ...

  4. 第一章连通性问题-----algorithm in C 读书笔记

    首先不得不吐槽一下翻译的质量,霍红卫....你给我站出来,不打死你,只想问你一下,你当年四级过了吗? 问题描述 输入两个整数,代表两个节点,如果这两个整数没有建立连接(这包括直接连接和通过其他节点连接 ...

  5. 强化学习读书笔记 - 02 - 多臂老O虎O机问题

    # 强化学习读书笔记 - 02 - 多臂老O虎O机问题 学习笔记: [Reinforcement Learning: An Introduction, Richard S. Sutton and An ...

  6. 【读书笔记】《Computer Organization and Design: The Hardware/Software Interface》(1)

    笔记前言: <Computer Organization and Design: The Hardware/Software Interface>,中文译名,<计算机组成与设计:硬件 ...

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

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

  8. 《Unix编程艺术》读书笔记(1)

    <Unix编程艺术>读书笔记(1) 这两天開始阅读该书,以下是自己的体会,以及原文的摘录,尽管有些东西还无法全然吃透. 写优雅的代码来提高软件系统的透明性:(P134) Elegance ...

  9. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

随机推荐

  1. [Android Pro] AndroidStudio IDE界面插件开发(进阶篇之Editor)

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53885981] 我们开发AndroidStudio ...

  2. diff详解

    作者: 阮一峰 日期: 2012年8月29日 diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异,是代码版本管理的基石之一.你在命令行下,输入: $ diff <变动前 ...

  3. django外键以及主表和子表的相互查询

    Django的外键使用 from django.db import models # Create your models here. class Category(models.Model): na ...

  4. 诺基亚S40手机联系人导入安卓手机

    电话号码较少的话比较简单,拷贝到SIM卡中通过SIM卡中转,只是一般SIM卡只能存储200个左右,联系人比较多的情况就麻烦一点,今天帮导师把诺基亚5220中的800个电话转到三星S4中,综合下来还是使 ...

  5. Identifier:GUID (全局唯一标识符)

    ylbtech-Miscellaneos-Identifier:GUID (全局唯一标识符) A,返回顶部 1, 全局唯一标识符(GUID,Globally Unique Identifier)是一种 ...

  6. 基于ZigBee和STM32的智能家居控制系统的设计与实现(三)

    基于ZigBee和STM32的智能家居控制系统的设计与实现(三) 自从前两篇博客介绍了智能家居系统的基本实现机理后,收到了好多朋友的来信,和我讨论了好多的这方面的知识,在此很高兴,虽然自己做的这个所谓 ...

  7. 8 个基于 Lucene 的开源搜索引擎推荐

    Lucene是一种功能强大且被广泛使用的搜索引擎,以下列出了8种基于Lucene的搜索引擎,你可以想象它们有多么强大. 1. Apache Solr Solr 是一个高性能,采用Java5开发,基于L ...

  8. 关于html+ashx开发中几个问题的解决方法 (转)

    在跟html+ashx打交道的园友们肯定会发现,这种模式虽然优美,但在开发中会遇到一些难处理的地方.我也不例外,下面是自己在实际开发中总结出来的几条经验,希望跟大家分享,更希望得到大家的建议和更好的解 ...

  9. 【Spark】SparkStreaming-加载外部配置文件

    SparkStreaming-加载外部配置文件 spark加载配置文件_百度搜索 Spark加载外部配置文件 - CSDN博客 spark读取配置文件中的配置 - CSDN博客 spark加载prop ...

  10. 详细解读简单的lstm的实例

    http://blog.csdn.net/zjm750617105/article/details/51321889 本文是初学keras这两天来,自己仿照addition_rnn.py,写的一个实例 ...