算法导论(第三版)
在这周末看了《算法导论》(第三版)这本书一些部分,看的时候属于囫囵吞枣,属于懂得有这么个算法,也懂得大概怎么做,用了什么技巧,也懂得他的运行时间复杂度处于一种什么水平。但是对于其中的证明只能说大概看懂,习题也没做,甚至有些星号章节,直接跳过了,因为我觉得就这一次看书的目的来说,我只看前面的部分效果已经达到了。
我这次看书的目的就是为了知道解决各种问题,有一些什么算法,不至于我在看论文时,连最大流、B树、割、线性规划(标准型和松弛型)、NP完全(NP-Complete)、NP困难(NP-hard)、集合覆盖问题、电路可满足性问题等等这些相对来说比较基础的知识都不懂。
作为非科班出身,我自学数据结构与算法,并且平时做题,那么最快了解的方式就是不求甚解的过一遍经典书籍,知道领域中存在什么东西,以后在科研中或者继续学习中,更加深入的学习这些算法,实现它,应用它。这也是我觉得非科班学计算机的比较高效的方法,你没有时间去一门一门课实验、习题等等都跟完,并且那样子战线拉得太长了,加上没有同辈一起学习也没有的deadline,很可能永远停留在第一章😂。
总体来说,计算机领域的知识搭建,对于非科班来说,先整体,再局部。这样可能会更有学下去的动力。对于科班的来说,我觉得CSAPP应该是必学吧,对于之后的学习都有好处。
另外,在本人非常浅的看本书的过程中,我个人发现了很多错误,因为它不改,就推导不出后面的结论,所以个人觉得他一定要改的,目前还没有和英文原版真正的比对,因为自己发现了,即使没发现,也不大影响我目前的目的:浅浅的看一下,有个了解。但是,如果要深入学,那还是要英文原版对应着看的,他的翻译水平和CSAPP差太远了,CSAPP几乎没错误,并且各种名词翻译的也挺好,再次推荐这本书。
第一部分 基础知识
这一部分,我在很久前看的,当时看的是第1~4章,中间设计很多基础知识,数学方法,数学归纳法什么的,这些其实在平时的学习中都有用到,这部分算是一个总结。第五章还没看,暂时不打算看了,之后再说吧。
第 1 章 算法在计算中的应用
1.1 算法
1.2 作为一种技术的算法
第 2 章 算法基础
2.1 插入排序
2.2 分析算法
2.3 设计算法
2.3.1 分治法
2.3.2 分析分治算法
第 3 章 函数的增长
3.1 渐近记号
3.2 标准记号与常用函数
第4 章 分治策略
4.1 最大子数组问题
4.2 矩阵乘法的 Strassen 算法
4.3 用代入法求解递归式
4.4 用递归树方法求解递归式
4.5 用主方法求解递归式
*4.6 证明主定理
4.6.1 对 b 的幂证明主定理
4.6.2 向下取整和向上取整
第 5 章 概率分析和随机算法
5.1 雇佣问题
5.2 指示器随机变量
5.3 随机算法
*5.4 概率分析和指示器随机变量的进一步使用
5.4.1 生日悖论
5.4.2 球与箱子
5.4.3 特征序列
5.4.4 在线雇佣问题
第二部分 排序和顺序统计量
这一部分算是很熟悉的了,很多书上都有,并且任何介绍算法的文章都绕不开排序,网上关于排序的帖子也是多如牛毛,各种动态图。并且相关的排序算法也在《算法》(第4版)中已经学习过,并且都自己实现过,知道他是怎么排的,怎么用,时间复杂度,有什么特性,等等。所以看本书过程中,这个部分全没有看,但是肯定是不大影响我的理解的,因为反正证明也不是我的重点。没有不做练习的看证明是没有效果的。
第 6 章 堆排序
6.1 堆
6.2 维护堆的性质
6.3 建堆
6.4 堆排序算法
6.5 优先队列
第 7 章 快速排序
7.1 快速排序的描述
7.2 快速排序的性能
7.3 快速排序的随机化版本
7.4 快速排序分析
7.4.1 最坏情况分析
7.4.2 期望运行时间
第 8 章 线性时间排序
8.1 排序算法的下界
8.2 计数排序
8.3 基数排序
8.4 桶排序
第 9 章 中位数和顺序统计量
9.1 最小值和最大值
9.2 期望为线性时间的选择算法
9.3 最坏情况为线性时间的选择算法
第三部分 数据结构
再次没有看的部分,因为平时用的很多,对这些基本的数据结构可以说是非常熟悉了。并且《算法》(第4版)对这些数据结构讲解的也非常清晰。对于红黑树这一章,我在看《算法》(第4版)时,曾经两本拿起来对照看过,我觉得,《算法》(第4版)讲解的非常好,比这本书讲的好,推荐《算法》(第4版)。
第 10 章 基本数据结构
10.1 栈和队列
10.2 链表
10.3 指针和对象的实现
10.4 有根树的表示
第 11 章 散列表
11.1 直接寻址表
11.2 散列表
11.3 散列函数
11.3.1 除法散列法
11.3.2 乘法散列法
*11.3.3 全域散列法
11.4 开放寻址法
11.5 完全散列
第 12 章 二叉搜索树
12.1 什么是二叉树
12.2 查询二叉搜索树
12.3 插入和删除
12.4 随机构建二叉搜索树
第 13 章 红黑树
13.1 红黑树的性质
13.2 旋转
13.3 插入
13.4 删除
第 14 章 数据结构的扩张
14.1 动态顺序统计
14.2 如何扩张数据结构
14.3 区间树
第四部分 高级设计和分析技术
本部分看了第15.16章,这是非常重要的算法思想, 15章是在我写动态规划博客的那段时间看的,看完后,还做了很多动态规划的题。贪心算法也看了并做了很多题,总体来说,贪心算法我觉得比动态规划简单,动态规划定义子结构和转移方程太难了。
17章,算是算法分析的一章吧,基础的摊还我还是知道点的,这里再看估计就是纯数学分析了,不设计算法,不做算法分析,我此次的目的不在本章。
第 15 章 动态规划
15.1 钢条切割
15.2 矩阵链乘法
15.3 动态规划原理
15.4 最长公共子序列
15.5 最优二叉搜索树
第 16 章 贪心算法
16.1 活动选择问题
16.2 贪心算法原理
16.3 赫夫曼编码
*16.4 拟阵和贪心算法
*16.5 用拟阵求解任务调度问题
第 17 章 摊还分析
17.1 聚合分析
17.2 核算法
17.3 势能法
17.4 动态表
17.4.1 表扩张
17.4.2 表扩张和收缩
第五部分 高级数据结构
本部分所有章节全部看了,首先讲21章,本章我以为是什么高级结构,结果和《算法》(第4版)第一部分就讲到的Union-Find算法(并查集算法)一样,只是本书多了很多理论证明,证明他的运行时间的上下界,真的头大。这个算法,平时用的挺多,路径压缩和按秩合并都是很熟的,UF算法手写过很多次。
第18章将的B树可以说是有多个子节点红黑树吧,所有叶节点的深度一样,也是一种 O ( log n ) O(\log n) O(logn)的操作,学起来比较简单。
第19章,多个根节点的多叉堆,中间删除最小顶点后,合并相同度数的根节点做的很不错,并且删除节点时,将子树变为森林中的一棵树,有一个标记,少了两个孩子,变为一颗子树等等,最后很多操作的渐进复杂度有提升,但是他的实现比较复杂。
第20章,讲到了簇,并且van Emde Boas树中的数据在一个给定的范围内 ( 0 , 1 , 2 , ⋯ , u − 1 ) (0, 1, 2, \cdots, u-1 ) (0,1,2,⋯,u−1),通过一些位操作,可以快速得到元素所在的位置,不过这个数据结构,我只能说复杂,我这辈子应该都不会要去真正实现他吧。
第 18 章 B 树
18.1 B 树的定义
18.2 B 树上的基本操作
18.3 从 B 树上删除关键字
第 19 章 斐波那契堆
19.1 斐波那契结构
19.2 可合并堆操作
19.3 关键字减值和删除一个结点
19.4 最大度数的界
第 20 章 van Emde Boas 树
20.1 基本方法
20.2 递归结构
20.2.1 原型 van Emde Boas 结构
20.2.2 原型 van Emde Boas 结构上的操作
20.3 van Emde Boas 树及其操作
20.3.1 van Emde Boas 树
20.3.2 van Emde Boas 树的操作
第 21 章 用于不相交集合的数据结构
21.1 不相交集合的操作
21.2 不相交集合的链表表示
21.3 不相交集合森林
*21.4 带路径压缩的按秩合并的分析
第六部分 图算法
这部分也全看,22~24章和《算法》(第4版)中的内容大差不差(不考虑数学证明的话),所以看的也挺快挺顺利。
25章,把节点对之间的最短路径变为动态规划问题,两种不同的动态规划方式,导致不同的时间复杂度。第一种他吧动态规划和矩阵乘法联系起来,并且用每次2倍的增长,使得复杂度降低了。第二种方法利用了最短路径上的其他点,也是其他点的最短路径这一性质,也导出了一个动态规划算法。
26章,最大流问题。最大流最小割定理。残存网络,增广路径啥的。前置重贴标签算法很巧妙,大概懂了他是怎么做的,证明真的是没看大懂,这章的证明是本书我看过的到目前为止最难的,当然后面第7部分的证明更难,很多直接跳过了。
第 22 章 基本的图算法
22.1 图的表示
22.2 广度优先搜索
22.3 深度优先搜索
22.4 拓扑排序
22.5 强连通分量
第 23 章 最小生成树
23.1 最小生成树的形成
23.2 Kruskal 算法和 Prim 算法
第 24 章 单源最短路径
24.1 Bellman-Ford 算法
24.2 有向无环图中的单源最短路径问题
24.3 Dijkstra 算法
24.4 差分约束和最短路径
24.5 最短路径性质的证明
第 25 章 所有结点对的最短路径问题
25.1 最短路径和矩阵乘法
25.2 Floyd-Warshall 算法
25.3 用于稀疏图的 Johnson 算法
第 26 章 最大流
26.1 流网络
26.2 Ford-Fulkerson 方法
26.3 最大二分匹配
*26.4 推送-重贴标签算法
*26.5 前置重贴标签算法
第七部分 算法问题选编
这部分看了29、31、33、34、35。
一个字:难
最大的收获,了解名词,大概用什么方法解决这些算法问题。至于证明,一笑而过。
第 27 章 多线程算法
27.1 动态多线程基础
27.2 多线程矩阵乘法
27.3 多线程归并排序
第 28 章 矩阵运算
28.1 求解线性方程组
28.2 矩阵求逆
28.3 对称正定矩阵和最小二乘逼近
第 29 章 线性规划
29.1 标准型和松弛型
29.2 将问题表达为线性规划
29.3 单纯形算法
29.4 对偶性
29.5 初始基本可行解
第 30 章 多项式与快速傅里叶变换
30.1 多项式的表示
30.2 DFT 和 FFT
30.3 高效 FFT 实现
第 31 章 数论算法
31.1 基础数论概念
31.2 最大公约数
31.3 模运算
31.4 求解模线性方程
31.5 中国余数定理
31.6 元素的幂
31.7 RSA 公钥加密系统
*31.8 素数的测试
*31.9 整数的因子分解
第 32 章 字符串匹配
32.1 朴素字符串匹配算法
32.2 Rabin-Karp 算法
32.3 利用有限自动机进行字符串匹配
32.4 Knuth-Morris-Pratt 算法
第 33 章 计算几何学
33.1 线段的性质
33.2 确定任意一对线段是否相交
33.3 寻找凸包
33.4 寻找最近点对
第 34 章 NP 完全性
34.1 多项式时间
34.2 多项式时间的验证
34.3 NP 完全性与可归约性
34.4 NP 完全性的证明
34.5 NP 完全问题
34.5.1 团问题
34.5.2 顶点覆盖问题
34.5.3 哈密顿回路问题
34.5.4 旅行商问题
34.5.5 子集和问题
第 35 章 近似算法
35.1 顶点覆盖问题
35.2 旅行商问题
35.2.1 满足三角不等式的旅行商问题
35.2.2 一般旅行商问题
35.3 集合覆盖问题
35.4 随机化和线性规划
35.5 子集和问题
第八部分 附录:数学基础知识
附录 A 求和
A.1 求和公式及其性质
A.2 确定求和时间的界
附录 B 集合等离散数学内容
B.1 集合
B.2 关系
B.3 函数
B.4 图
B.5 树
B.5.1 自由树
B.5.2 有根树和有序树
B.5.3 二叉树和位置树
附录 C 计数与概率
C.1 计数
C.2 概率
C.3 离散随机变量
C.4 几何分布与二项分布
C.5 二项分布的尾部
附录 D 矩阵
D.1 矩阵与矩阵运算
D.2 矩阵的基本性质