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

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

第一章 引言

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

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

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

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

//1.1 连通问题的快速查找算法
#include <stdio.h> #define N 10 int 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 10

int 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 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])
/*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

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

《算法:C语言实现》阅读笔记的更多相关文章

  1. 阅读《RobHess的SIFT源码分析:综述》笔记

    今天总算是机缘巧合的找到了照样一篇纲要性质的文章. 如是能早一些找到就好了.不过“在你认为为时已晚的时候,其实还为时未晚”倒是也能聊以自慰,不过不能经常这样迷惑自己,毕竟我需要开始跑了! 就照着这个大 ...

  2. RobHess的SIFT源码分析:imgfeatures.h和imgfeatures.c文件

    SIFT源码分析系列文章的索引在这里:RobHess的SIFT源码分析:综述 imgfeatures.h中有SIFT特征点结构struct feature的定义,除此之外还有一些特征点的导入导出以及特 ...

  3. RobHess的SIFT源码分析:综述

    最初的目的是想做全景图像拼接,一开始找了OpenCV中自带的全景拼接的样例,用的是Stitcher类,可以很方便的实现全景拼接,而且效果很好,但是不利于做深入研究. 使用OpenCV中自带的Stitc ...

  4. 阅读《RobHess的SIFT源码分析:综述》笔记2

    今天开始磕代码部分. part1: 1. sift特征提取. img1_Feat = cvCloneImage(img1);//复制图1,深拷贝,用来画特征点 img2_Feat = cvCloneI ...

  5. element-ui button组件 radio组件源码分析整理笔记(一)

    Button组件 button.vue <template> <button class="el-button" @click="handleClick ...

  6. element-ui 组件源码分析整理笔记目录

    element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...

  7. element-ui Carousel 走马灯源码分析整理笔记(十一)

    Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...

  8. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

  9. element-ui MessageBox组件源码分析整理笔记(十二)

    MessageBox组件源码,有添加部分注释 main.vue <template> <transition name="msgbox-fade"> < ...

  10. element-ui switch组件源码分析整理笔记(二)

    源码如下: <template> <div class="el-switch" :class="{ 'is-disabled': switchDisab ...

随机推荐

  1. 几条特殊的SQL语句

    1, 有case情况. select trunc(exf_payment_receipt.work_date),exf_payment_receipt.exchange_code,exf_paymen ...

  2. Unity3d Shader开发(三)Pass(Texturing )

    纹理在基本的顶点光照被计算后被应用.在着色器中通过SetTexture 命令来完成.   SetTexture 命令在片面程序被使用时不会生效:这种模式下像素操作被完全描述在着色器中. 材质贴图可以用 ...

  3. Oracle本地,远程,分布式登录

    identify认证,确定; identity同一性,个性; 本地连接 sqlplus scott/tiger@localhost:1521/orcl 这句话就等于sqlplus scott/tige ...

  4. 求解 s = (1*1)!+(2*2)! + (3*3)!+...+(n*n)! (C语言)

    提示:定义函数可以求阶乘,再定义函数求阶乘之和.1和0的阶乘是1,n(n > 1)的阶乘是n * (n-1) * (n - 2) * … * 1 //采用了函数嵌套调用和函数递归调用 //求解阶 ...

  5. Fast UI Draw (Intel出品)

    Fast UI Draw in a library that provides a higher performance Canvas interface. It is designed so tha ...

  6. 如何查看自己运行ubuntu是32位还是64位

    当安装ubuntu在pc上,不推荐在32位pc安装64位操作系统,64位pc安装32位操作系统 方法/步骤 按ctrl+shift+t 快捷键,打开终端,输入sudo uname --m ,按下ent ...

  7. wzplayer V1.6正式版(无限制)不支持加密版本 2014-07-08

    2014-07-08 修复部分视频倾斜问题,同时给受影响的客户给予更新. wzplayer V1.6正式版(无限制)不支持加密版本 发布于官方,下载地址wzplayer V1.6正式版(无限制)不支持 ...

  8. Oracle系列之视图

    涉及到表的处理请参看原表结构与数据  Oracle建表插数据等等 创建视图,把tb_Employee表sal<1000的雇员,映射到该视图( view) create or replace vi ...

  9. Sublime Text 插件 autoprefixer

    Sublime Text 早就有插件(Sublime Prefixr)使用 prefixr 的 API 来自动完成 CSS 前缀,但是 autoprefixer 更牛,这款可使用 Can I Use ...

  10. bzoj1054

    弱弱的搜索题, 我的做法是将矩阵看做二进制然后用位运算来做的,感觉比较舒服 ..] ,,,);       dy:..] ,,-,); type node=record        po,next: ...