《算法: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 ...
随机推荐
- mysql(转)
/* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld ...
- hive--UDF、UDAF
1.UDF package com.example.hive.udf; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.had ...
- 一步步学习NHibernate(8)——HQL查询(2)
请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,老魏带着大家学习了HQL语句,发现HQL语句还是非常不错的,尤其是在懒加载的时候,书写起来比较的舒服,但是这里老魏 ...
- css 垂直同步的几种方式
第一种: 利用 display:table 和 display:table-cell 的方式 这种方式就好像将table布局搬过来一样,相信大家对table的td还是有印象的,它的内容是可以设置垂直居 ...
- Spring中argNames的含义
最近学习Spring,一直不太明白Srping的切面编程中的的argNames的含义,经过学习研究后,终于明白,分享一下 先看一个例子: 需要监控的类: package bean; public cl ...
- Fiddler对安卓应用手机抓包图文教程
http://www.cr173.com/html/37625_1.html 做开发需要抓取手机app的http/https的数据包,想看APP发出的http请求和响应是什么,这就需要抓包了,这可以得 ...
- Linux下eclipse的安装以及配置
在安装好jdk并配置好后,就可以进行eclipse的安装了,其步骤如下: 1.下载eclipse 我所用的eclipse为:eclipse-dsl-juno-SR1-linux-gtk.tar 2. ...
- IE10与IMG图片PNG显示不了 WP中的WebBrowser中无法查看PNG格式的图片
在IE10下,IMG的图片不能是PNG格式的,PNG格式显示不了,JPG显示就可以
- 《深入理解linux内核》第三章 进程
进程的七种状态 在内核源码的 include/linux/sched.h文件中: task_struct的status可表示 #define TASK_RUNNING 0 #define TASK_I ...
- Cannot Create Supplier Site (Address) (文档 ID 1069032.1)
Error Address and Site Creation - Unable to create address and sites because of the following error ...