黑客帝国:Neo,是这个问题驱使着我们,是这个问题带你来到这儿。你知道这个问题,我也是。
第一部分
第1章 算法真的很重要
malloc()一个包装了系统内存分配函数的函数。
free()一个包装了系统内存回收函数的函数。
exit()一个包装了系统退出函数的函数。
如果需要,尽可能用实践检验
你对二叉树进行了平衡处理吗?
算法真的很重要
每一个优秀的软件开发者都应该具备。并不需要你能够对算法进行详细的数学分析,但是你必须能够理解这些分析。
第2章 算法的数学原理
问题的样本规模
设计一个高效的算法通常是从选择一个合适的数据结构开始的。
第3章 模式和领域
我们编写软件是为了解决问题
模式:一种交流语言。
设计模式是一个验证过的解决方案,这个解决方案能够一般问题。
算法模式的格式:名称,梗概,使用环境,驱动因素,解决方案,结论,分析,相关算法。
第二部分
第4章 排序算法
插入排序
中值排序
快速排序
在快速排序中,我们不再寻找中值,而是通过某些策略来选择一个元素,这个元素将数组切分成了两个子数组。
选择排序
堆排序
计算排序
桶排序
第5章 查找
存在性查询,检索查询,关联查找
二分查找每次将有序集合折半直到找到待查找元素
最常使用的一个方法是使用散列函数来将目标元素的一个或者多个特征转换成一个值,这个值用来索引一个已经索引的散列表。
不适当的散列函数可能会导致一个不均匀的键值分布。
选择散列函数是在实现基于散列的查找之前必须做的第一个决定。
二叉查找树
AVL树和红黑树
红黑树和其他的平衡二叉树是内存查找的最好选择。
n路树和B树
第6章 图算法
无向图,有向图,有权图,超图
存储结构有:邻接表,邻接矩阵
决定使用邻接表还是邻接矩阵的最重要因素是图是否为稀疏图。
深度优先探索,广度优先搜索
单源最短路径,所有点对最短路径,最小生成树算法(Prime)
第7章 人工智能中的寻路
如果一个问题没有明确的解决算法,那么我们可以考虑使用寻路算法。在这章我们将讨论两种寻路算法,一种基于博弈树,另外一种基于搜索树。
深度优先搜索
博弈树和搜索树的一个不同就是搜索树必须在搜索中存储棋面状态的副本。基于博弈树的搜索算法在搜索过程中只需要执行或者撤销走法。
广度优先搜索
广度优先搜索尝试在不重复访问状态的情况下,寻找到一种最短路径。
A*搜索在搜索时能够利用启发式信息,智能地调整搜索策略。
A*搜索是一种迭代的有序搜索,它维护一个棋面状态的开放集合,在每次迭代时,A*搜索使用一个评价函数f*(n)评价开放集合中的所有棋面状态,选择最小的棋面状态。
A*搜索的效果直接依赖于其启发式函数。
Minimax
NegMax
第8章 网络流算法
有很多问题可抽象成顶点和有容易限制的边的网络。
任务分配,二部图匹配,运输问题,转运问题,最大流。
从理论上来说,你可以利用线性编程来解决上面提到的所有问题,但是你必须得先将这些问题转换成正确的线性表示形式,而且得到的解能够转换成原来的形式。
在一个流网络中,如果我们给定了所有边的容量,那么我们可以计算出这个流网络的最大流。
Ford-Fulkerson 增广路径。
流网络的典型实现方式是使用数组存储信息。
二部图匹配
最小开销流:解决最小开销流问题,我们仅仅需要构造一个流网络图,并且保证满足之前讨论过的那些限制条件:容量限制、流量守恒以及反对称。
第9章 计算几何
计算几何和点、线和面这样的几何物体关系非常紧密。
计算几何经典问题:凸包,计算线段集的相交,寻找最近邻点
凸包扫描,最早计算凸包的一个算法叫做Graham扫描。
线段扫描
线段扫描的创新在于将所有的线段从左至右按照y坐标进行排序。
最近点查询
kd树的平衡调整
kd树的性能在高维度下非常差,算法在高维度下,性能会退化。
第10章 最后的招数
另类算法
近似算法
离线算法
并行算法
随机算法
第11章 尾声
原则:了解数据
原则:将问题分解至更小的问题
原则:选择正确的数据结构
原则:空间换时间
原则:如果没有显而易见的解法,使用搜索
原则:如果没有显而易见的解法,将问题归约为另一个有解的问题
原则:编写算法难,测试算法更难
第四部分
附录 基准测试