《算法:C语言实现》阅读笔记
//从今天起准备认真看完这本书。本渣虽然笨,但是窝懒啊。。。。
//今天开始看第一章。希望坚持下去。
第一章 引言
通过讨论连通问题的几种算法,来引出算法的重要性。
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语言实现》阅读笔记的更多相关文章
- 阅读《RobHess的SIFT源码分析:综述》笔记
今天总算是机缘巧合的找到了照样一篇纲要性质的文章. 如是能早一些找到就好了.不过“在你认为为时已晚的时候,其实还为时未晚”倒是也能聊以自慰,不过不能经常这样迷惑自己,毕竟我需要开始跑了! 就照着这个大 ...
- RobHess的SIFT源码分析:imgfeatures.h和imgfeatures.c文件
SIFT源码分析系列文章的索引在这里:RobHess的SIFT源码分析:综述 imgfeatures.h中有SIFT特征点结构struct feature的定义,除此之外还有一些特征点的导入导出以及特 ...
- RobHess的SIFT源码分析:综述
最初的目的是想做全景图像拼接,一开始找了OpenCV中自带的全景拼接的样例,用的是Stitcher类,可以很方便的实现全景拼接,而且效果很好,但是不利于做深入研究. 使用OpenCV中自带的Stitc ...
- 阅读《RobHess的SIFT源码分析:综述》笔记2
今天开始磕代码部分. part1: 1. sift特征提取. img1_Feat = cvCloneImage(img1);//复制图1,深拷贝,用来画特征点 img2_Feat = cvCloneI ...
- element-ui button组件 radio组件源码分析整理笔记(一)
Button组件 button.vue <template> <button class="el-button" @click="handleClick ...
- element-ui 组件源码分析整理笔记目录
element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...
- element-ui Carousel 走马灯源码分析整理笔记(十一)
Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...
- STL源码分析读书笔记--第二章--空间配置器(allocator)
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...
- element-ui MessageBox组件源码分析整理笔记(十二)
MessageBox组件源码,有添加部分注释 main.vue <template> <transition name="msgbox-fade"> < ...
- element-ui switch组件源码分析整理笔记(二)
源码如下: <template> <div class="el-switch" :class="{ 'is-disabled': switchDisab ...
随机推荐
- uCGUI窗口操作要点
uCGUI窗口操作要点 1. 创建一个窗口的时候,会给此窗口发送“创建(WM_CREATE)”消息,从而执行它的回调函数:如果创建窗口的标志带有“可视标志(WM_CF_SHOW)”,那么在后续执行GU ...
- 机器学习算法与Python实践之(二)支持向量机(SVM)初级
机器学习算法与Python实践之(二)支持向量机(SVM)初级 机器学习算法与Python实践之(二)支持向量机(SVM)初级 zouxy09@qq.com http://blog.csdn.net/ ...
- 对 APM 用户的一次真实调查分析(上)
一.前言 国内的 APM 行业这两年刚刚起步,但是在国外却比较成熟了,并且由于这两年人力成本的快速提高,国内外涌现了几家非常不错的 APM 企业,例如,OneAPM,APPdynamic,Dynami ...
- HTTP错误代码详细介绍
HTTP 400 - 请求无效 HTTP 401.1 - 未授权:登录失败 HTTP 401.2 - 未授权:服务器配置问题导致登录失败 HTTP 401.3 - ACL 禁止访问资源 HTTP 40 ...
- HDU4535+公式
错排公式. 用64位! /* */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include ...
- UVALive 5903 Piece it together
一开始用的STL一直超时不能过,后来发现AC的代码基本都用的普通邻接表,然后改了一下13s,T=T,效率太低了.然后把某大神,详情戳链接http://acm.hust.edu.cn/vjudge/pr ...
- uva 11646 - Athletics Track
题意:如图,体育场的跑道一圈是400米,其中弯道是两段半径相同的圆弧.已知矩形的长宽比例为a:b,求长和宽的具体数值. 注意:圆弧的圆心在纵轴线上! #include<iostream> ...
- 在ubuntu系统荣品开发配套JDK安装
chmod 755 jdk-6u29-linux-i586.bin ./jdk-6u29-linux-i586.bin
- Hadoop中两表JOIN的处理方法
Dong的这篇博客我觉得把原理写的很详细,同时介绍了一些优化办法,利用二次排序或者布隆过滤器,但在之前实践中我并没有在join中用二者来优化,因为我不是作join优化的,而是做单纯的倾斜处理,做joi ...
- GridView導出Excel 解決亂碼問題
Response.Clear(); Response.Charset = "gb2312"; Response.Buffer = true; Response.AddHeader( ...