算法之道(第2版)-邹恒明pdf高清扫描版
分享到:
算法之道(第2版)2012年4月由机械工业出版社出版发行,是一本关于算法方面的学习书籍。在当今这个时代算法无处不在,每个人每天都在使用不同的算法来活出自己的人生,比如你去食堂买饭会选择一个较短的队列,而有人则可能选择一个推进速度更快的队列等等。都是算法或算法一部分的体现,所以学习算法关乎我们生活和未来。小编分享的这本算法之道(第2版)追求的目标是算法背后的逻辑,是一本启示书,而不是一本包罗万象的算法大全。因此,本书甄选了那些最能展现算法思想、战略和精华,并能够有效训练算法思维的内容。本书将算法的讨论分为五篇:算法基础篇、算法设计篇、算法分析篇、经典算法篇、难解与无解篇。每篇分别讨论算法的一个方面:基础、设计、分析、经典和难解问题。第2版还对进程调度问题、跳转表问题、概率分析应用、遗传算法等方面进行了论述。算法之道(第2版)既可以作为大学本科或研究生的算法教材或参考书,也可以作为对算法有兴趣的读者提升认知深度的读物。
算法战略、算法思维、算法智慧,算法就是一切。
第一篇 算法基础篇
第1章 从无有到无穷
1.1 意念与现实
1.2 什么是算法
1.3 算法的表示
1.4 算法之魂
1.5 如何比较速度
1.6 算法与计算机的关系
1.7 算法的范畴
1.8 为什么学习算法
思考题
第2章 计数与渐近
2.1 算法的分析
2.1.1 正确性分析
2.1.2 时空效率分析
2.1.3 时空特性分析
2.2 计数:算法分析的核心
2.3 算法设计
2.4 算法效率表示
2.5 渐近分析
2.6 表示
2.7 最好、最坏、平均
2.8 另一类定义
2.9 性质
2.10 要更快的计算机还是要更快的算法
思考题
第3章 分治与递归
3.1 分而治之为上策
3.2 分治策略
3.3 递归表达式求解
3.3.1 递归树法
3.3.2 替换解法
3.3.3 大师解法
3.4 分治策略举例1:乘方运算
3.5 生命中不能承受之重:矩阵乘法
3.6 魔鬼序列:斐波那契序列
3.6.1 由底至上
3.6.2 使用通式
3.6.3 使用矩阵乘方
3.7 VLSI 布线
3.8 多项式乘法
3.9 分治就在潜意识
思考题
第二篇 算法设计篇
第4章 动态规划思想
4.1 什么是动态规划
4.2 流水线问题
4.3 最长公共子序列
4.3.1 第一种解法:蛮力策略
4.3.2 第二种解法:动态规划
4.4 最长公共子序列变种
4.5 记忆递归法
4.6 空间效率改善
4.7 最优二叉搜索树
4.7.1 递归解法
4.7.2 计算最优答案
4.8 最优子结构与重叠子问题
4.8.1 最优子结构
4.8.2 重叠子问题
4.9 动态规划与静态规划的关系
4.10 动态规划与静态规划的相互转换
思考题
第5章 贪婪选择思想
5.1 仅有动态规划是不够的
5.2 什么是贪婪
5.3 背包问题
5.4 贪婪选择属性
5.5 教室规划问题
5.6 最小生成树
5.6.1 Kruskal算法的正确性
5.6.2 Kruskal算法的时间分析
5.7 Prim算法
5.8 霍夫曼树和霍夫曼编码
5.8.1 霍夫曼树
5.8.2 霍夫曼编码
5.8.3 霍夫曼编码的无前缀编码性质
5.9 进程调度问题
5.10 贪婪选择属性
5.11 标准分治、动态规划和贪婪选择的比较
思考题
第6章 随机化思想
6.1 为什么要随机化
6.2 随机的平方
6.3 什么是随机化算法
6.4 拉斯维加斯算法
6.5 蒙特卡罗算法
6.6 素性测试
6.7 矩阵乘积验证器
6.8 随机化最小生成树算法
6.8.1 Karger-Klein-Tarjan算法
6.8.2 结点降低算法
6.8.3 线性时间最小生成树算法
6.8.4 线性时间最小生成树算法的时间成本分析
6.9 随机数的生成
6.10 随机化算法的应用
思考题
第三篇 算法分析篇
第7章 概率分析
7.1 一切都在概率中
7.2 什么是概率分析
7.3 梦幻情人的代价
7.3.1 直接分析
7.3.2 最坏情况分析
7.3.3 最好情况分析
7.3.4 平均情况分析
7.3.5 平均情况下成本的概率分析
7.3.6 概率分析结果的有效性
7.3.7 正确概率分析的保障
7.4 梦幻情人的概率
7.5 随机排列问题
7.6 跳转表问题
7.6.1 跳转表插入操作
7.6.2 随机化跳转表构建算法
7.7 南柯一梦:从无穷到无有
7.8 概率分析的其他应用
思考题
第8章 摊销分析
8.1 什么是摊销分析
8.2 摊销分析与数据结构
8.3 摊销分析的几种方法
8.4 聚类分析
8.4.1 栈操作的聚类分析
8.4.2 二进制计数器的聚类分析
8.5 会计分析
8.6 势能分析
8.6.1 栈操作的势能分析
8.6.2 二进制计数器的势能分析
8.7 摊销分析应用:表格扩展的代价
8.7.1 动态表插入操作的聚类分析
8.7.2 动态表插入操作的会计分析
8.7.3 动态表插入操作的势能分析
8.8 运气不好就摊销
思考题
第9章 竞争分析
9.1 什么是竞争分析
9.2 在线算法和离线算法
9.3 竞争力
9.4 健忘对手和优良对手
9.5 线性表更新问题
9.6 前置移动算法的竞争分析
9.7 聚类问题
9.7.1 聚类问题的次优解算法
9.7.2 CLUSTERING-ALGORITHM算法的竞争分析
9.8 竞争分析与普通算法分析
思考题
第四篇 经典算法篇
第10章 排序与次序
10.1 排序无处不在
10.2 插入排序
10.2.1 插入排序的效率分析
10.2.2 折半插入排序
10.3 归并排序
10.4 快速排序
10.4.1 快速排序的过程
10.4.2 快速排序的时间复杂性分析
10.4.3 最坏情况分析
10.4.4 最好情况分析
10.4.5 平均情况分析
10.5 随机化快速排序
10.6 排序的下限
10.7 线性排序
10.8 计数排序
10.9 基数排序
10.9.1 基数排序的正确性
10.9.2 基数排序的时间效率分析
10.10 桶排序
10.10.1 桶排序的定义
10.10.2 桶排序的正确性
10.10.3 桶排序的时间复杂性分析
10.11 次序选择
10.12 快速次序选择算法
10.13 随机快速次序选择算法
10.14 最坏情况下的线性选择算法
10.14.1 杠杆点好坏分析
10.14.2 算法时间复杂性分析
思考题
第11章 搜索与散列
11.1 搜索问题
11.2 顺序搜索
11.3 折半搜索
11.4 常数搜索
11.5 散列搜索
11.6 散列函数选择
11.6.1 直接散列
11.6.2 除法(模除法)散列
11.6.3 乘法散列
11.6.4 乘法散列的赌徒原理
11.6.5 乘方取中法
11.7 散列算法的碰撞问题
11.7.1 开放寻址散列
11.7.2 开放寻址散列的时间成本
11.7.3 开放寻址下成功搜索的时间成本
11.7.4 封闭寻址散列
11.7.5 探寻序列的设计
11.7.6 封闭寻址散列的效率分析
11.7.7 搜索不成功的时间成本
11.7.8 成功搜索的效率分析
11.8 散列表元素删除
11.9 随机化散列
11.10 全域散列
11.11 完美散列
思考题
第12章 最短路径
12.1 剑指罗马
12.2 最短路径问题
12.3 单源单点最短路径问题
12.3.1 深度优先与广度优先搜索
12.3.2 深度优先解法
12.4 单源多点最短路径问题
12.4.1 最短路径的性质
12.4.2 Dijkstra最短路径算法
12.4.3 Dijkstra算法举例
12.4.4 Dijkstra算法与洪水泛滥
12.4.5 Dijkstra算法的正确性
12.4.6 Dijkstra算法的时间复杂性
12.5 Bellman-Ford算法
12.5.1 负权重的应对方式
12.5.2 Bellman-Ford算法的正确性
12.5.3 负循环检查问题
12.5.4 Bellman-Ford算法的时间复杂性
12.6 多源多点最短路径问题
12.6.1 多源多点最短路径问题解决思路
12.6.2 直接动态规划解法
12.6.3 矩阵乘法解法
12.6.4 Floyd-Warshall算法
12.6.5 Johnson算法
12.6.6 Johnson等效变换
12.6.7 差限问题解决
12.7 天意难违
思考题
第五篇 难解与无解篇
第13章 易解与难解
13.1 我们战无不胜吗
13.2 易解与难解
13.3 决策问题和优化问题
13.4 决策问题
13.5 P类问题
13.6 NP类问题
13.7 (确定性)图灵机
13.8 非确定性图灵机
13.9 非确定性算法
13.10 回到NP类问题
13.11 P和NP
13.12 搜索问题、决策问题和优化问题
13.13 有没有解和是否可决定
思考题
第14章 NP完全问题
14.1 玉龙雪山下的审判
14.2 NP完全问题的定义
14.3 NP完全的重要性
14.4 多项式时间规约
14.5 如何证明一个问题S是NP完全问题
14.6 第1个NP完全问题的证明
14.7 库克定理
14.8 3-SAT问题
14.9 证明NP难的技巧
14.10 整数规划
14.11 独立集问题
14.12 汉密尔顿回路问题
14.13 讨论:弱NP完全、强NP完全和中NP完全
思考题
第15章 无解与近似
15.1 难解问题
15.2 不可决定问题
15.3 程序终结的判断
15.4 难解之题的求解
15.5 智能穷举、近似算法和本地搜索
15.6 智能穷举之回溯策略
15.7 智能穷举之分支限界
15.8 贪婪近似策略
15.9 启发式搜索策略
15.10 模拟退火算法
15.10.1 模拟退火算法的思想
15.10.2 模拟退火算法的基本循环
15.10.3 退火算法描述
15.11 基因/遗传算法
15.11.1 生物进化与遗传
15.11.2 遗传算法的基本要义
15.11.3 遗传算法的实现
15.11.4 遗传算法的基本运算过程
15.11.5 遗传算法的现状
15.12 概率尽在一切中
思考题
结语 算法之道
附录 算法随想
参考文献
第1章 从无有到无穷
在第一类弗里德曼宇宙模型中,第四维—时间,正如空间一样,在范围上是有限的。它如一根具有两个端点或边界的线。因此时间具有终结,而且它也有一个开端。事实上,在宇宙具有我们观测到的物质总量的情形下,由爱因斯坦方程得出的所有解中,都有一个非常重要的特征:在过去某一时刻(大约137亿年以前)相邻星系之间的距离必须为零。换言之,整个宇宙被挤压在零尺度的单独一点,就像一个半径为零的球。那时,宇宙的密度和时空曲率都为无限大。它是我们称做大爆炸的时刻。
—摘自史蒂文·霍金《时间简史》
这个零尺度的单独一点被物理学家称做“原点”。它的另一个名字是奇异点(singularity)。但是零尺度是什么意思呢?霍金曾解释过:零尺度就是不占空间。那么不占空间是什么意思呢?也许读者猜出来了:没有(nothing)!即虚无。实际上,物理学家们普遍认为在原点之外没有空间,空间也是大爆炸后的产物。也就是说,宇宙是从无到有的,用希腊文来说就是Ex Nihilo(见图1-1)。
图1-1 Ex.Nihilo:宇宙从无到有的一刹那整个宇宙从无到有对一般人来说都很难理解,而这个原点是谁或者如何放在那里也是众说纷纭。不过,这不是本书准备要讨论的问题。本书关心的是算法,而算法具有一个与宇宙起源类似的性质:从无到有。不过这个从无到有却有着非同一般或者说更加丰富的意义,下面将详细分析。
1.1 意念与现实
先看一个例子。给你一个无限容积的罐子和无限个球,球从1开始连续编号。
在差1分钟到零点时:将标号为1~10的10个球放进罐子,然后将10号球从罐子拿出。
在差1/2分钟到零点时:将标号为11~20的10个球放进罐子,然后将20号球从罐子拿出。
在差1/4分钟到零点时:将标号为21~30的10个球放进罐子,然后将30号球从罐子拿出。
……
就这样将游戏进行下去。假定放球和取球不占时间,请问,当时钟指向零点时,罐子里还剩多少个球?
这个答案似乎很直接:无限个球!这是因为所有编号不是10n(n≥1)的球在放进去罐子里后就不会再拿出来;而在零点之前这种放球、取球的次数是无限的。因此,罐子里面的球数在零点时将是无数个。但是你很确信这个答案吗?
现在来让我们改变拿球的方式,将每次拿10、20、30、…号球分别变为拿1、2、3、…号球,即第x次拿球,所拿出来的球的编号是x。结果又会怎样呢?这个时候,神奇的事情发生了。这个罐子里面的球数将为0。我们来看,对于任意一个球,设其编号为n,则在差(1/2)n?1分钟到零点时该球将被取出。也就是说,对于任意球n,在零点时它都不在罐子里。因此,零点时罐子里球的个数为0。对于有些人来说,这个答案似乎不可接受。但又确实找不到驳斥的办法。你能找出来吗?也许这个答案是合理的,因为拿球顺序的变化使得算法发生了变化,即我们实际上讨论的是两个算法。可仔细一想又觉得不对,因为两个算法都是每次放进10个球,拿出1个球,即从根本上说,这是两个一样的算法,怎么会有截然相反的结果呢(见图1-2)图1-2 到底剩多少个球?不同的拿球顺序有不同的结果,如果我们再次改变试验中拿球的方式,将拿某个特定标号的球改为取出任意标号的球,即:
在差1分钟到零点时:将标号为1~10的10个球放进罐子,然后从罐子任意拿出一球。
在差1/2分钟到零点时:将标号为11~20的10个球放进罐子,然后从罐子任意拿出一球。
在差1/4分钟到零点时:将标号为21~30的10个球放进罐子,然后从罐子任意拿出一球。
……
这种拿球方式又将产生何种结果呢?
答案仍然是无有,即0(本书将在第1章对这个问题进行正面解析)。太不可思议了吧!这三个本质相同的算法怎么有如此匪夷所思的结果呢?如果非要说这三个算法有什么不同,那就是拿球时的标号不同。
难道是,标号的不同使最后球的数量发生了变化?
没错。就是这个标号对结果产生了深远影响。从某种意义上说,标号是虚的,它只存在于我们的想象中,但确实对现实结果产生了影响,即我们的思维使算法发生了变化。或许从另一个角度来看,这个问题就是:无有就是无穷,无穷就是无有。它们之间也许根本没有什么不同,它们的不同只存在于人们的想象或者意念中。也许这是为什么无穷的符号(是由两个0连接而成的,从左右两面看都是无有,而从中间看则是无穷,如图1-3所示。
图1-3 无有和无穷的区别也许只存在于人类的思维中从这个意义上说,算法是一种思维方式(algorithmic thinking),或者说一种哲学。而本书就是从算法思维的角度出发,阐述算法的灵魂。
1.2 什么是算法
究竟什么是算法呢?顾名思义,算法就是计算的办法或法则。这里的计算指的当然不只是加、减、乘、除等算术运算,而是广义的做任何事情的计算,而办法和法则意味着使用它就可以解决需要的问题。算法的历史可以追溯到9世纪的古波斯。最初它仅表示“阿拉伯数字的运算法则”。后来,它被赋予更一般的含义,即所谓的一组确定的、有效的、有限的解决问题的步骤。这是算法的最初定义,注意,这个定义里面没有包括“正确”。
推动算法传播的是生活在美索不达美亚的Al.Khwarizmi于9世纪一本以阿拉姆语(Aramaic)著述的教科书。该书列举了加、减、乘、除、求平方根和计算圆周率数值的方法。这些步骤的特点是:简单、没有歧义、机械、有效和正确—这就是算法。注意,这个定义加上了“正确”这个词。几百年后,当十进制计数法在欧洲被广泛使用时,“算法”(algorithm)这个单词被人们创造出来以纪念Al Khwarizmi先生。
由上面提到的定义可推知,算法作为解决问题的方法,它必须具备以下特点:·确定性,即无歧义,能让人照着执行。
·可行性,算法中的运算都是基本的,理论上能够由人用纸和笔完成。
·有限性,在有限输入下,算法必须能在有限步骤内实现有限输出。
此外,算法必须有输出、计算的结果,通常还有至少一个输入量。这是因为算法用以解决的问题的描述均包括输入和输出。
……
2.禁用于商业用途!如果您喜欢《算法之道(第2版)》,请购买正版,谢谢合作。
3.爱学习,请到3322软件站查找资源自行下载!
1、下载并解压,得出pdf文件
2、如果打不开本文件,别着急,这时候请务必在3322软件站选择一款阅读器下载哦
3、安装后,再打开解压得出的pdf文件
4、以上都完成后,接下来双击进行阅读就可以啦,朋友们开启你们的阅读之旅吧。
方法二:
1、可以在手机里下载3322软件站中的阅读器和百度网盘
2、接下来直接将pdf传输到百度网盘
3、用阅读器打开即可阅读
作者介绍:
邹恒明,美国密歇根大学(University.of.Michigan-Ann.Arbor)计算机科学与工程博士、中国科学院计算技术研究所硕士、华中科技大学计算机科学与技术学士。曾先后在美国IBM、美国国家数据公司、美国朗讯和美国EMC公司任职8年多。现为上海交通大学教授。官方介绍:
分析算法、演绎算法、品味算法,人生就是算法。算法战略、算法思维、算法智慧,算法就是一切。
(第2版)目录:
前言第一篇 算法基础篇
第1章 从无有到无穷
1.1 意念与现实
1.2 什么是算法
1.3 算法的表示
1.4 算法之魂
1.5 如何比较速度
1.6 算法与计算机的关系
1.7 算法的范畴
1.8 为什么学习算法
思考题
第2章 计数与渐近
2.1 算法的分析
2.1.1 正确性分析
2.1.2 时空效率分析
2.1.3 时空特性分析
2.2 计数:算法分析的核心
2.3 算法设计
2.4 算法效率表示
2.5 渐近分析
2.6 表示
2.7 最好、最坏、平均
2.8 另一类定义
2.9 性质
2.10 要更快的计算机还是要更快的算法
思考题
第3章 分治与递归
3.1 分而治之为上策
3.2 分治策略
3.3 递归表达式求解
3.3.1 递归树法
3.3.2 替换解法
3.3.3 大师解法
3.4 分治策略举例1:乘方运算
3.5 生命中不能承受之重:矩阵乘法
3.6 魔鬼序列:斐波那契序列
3.6.1 由底至上
3.6.2 使用通式
3.6.3 使用矩阵乘方
3.7 VLSI 布线
3.8 多项式乘法
3.9 分治就在潜意识
思考题
第二篇 算法设计篇
第4章 动态规划思想
4.1 什么是动态规划
4.2 流水线问题
4.3 最长公共子序列
4.3.1 第一种解法:蛮力策略
4.3.2 第二种解法:动态规划
4.4 最长公共子序列变种
4.5 记忆递归法
4.6 空间效率改善
4.7 最优二叉搜索树
4.7.1 递归解法
4.7.2 计算最优答案
4.8 最优子结构与重叠子问题
4.8.1 最优子结构
4.8.2 重叠子问题
4.9 动态规划与静态规划的关系
4.10 动态规划与静态规划的相互转换
思考题
第5章 贪婪选择思想
5.1 仅有动态规划是不够的
5.2 什么是贪婪
5.3 背包问题
5.4 贪婪选择属性
5.5 教室规划问题
5.6 最小生成树
5.6.1 Kruskal算法的正确性
5.6.2 Kruskal算法的时间分析
5.7 Prim算法
5.8 霍夫曼树和霍夫曼编码
5.8.1 霍夫曼树
5.8.2 霍夫曼编码
5.8.3 霍夫曼编码的无前缀编码性质
5.9 进程调度问题
5.10 贪婪选择属性
5.11 标准分治、动态规划和贪婪选择的比较
思考题
第6章 随机化思想
6.1 为什么要随机化
6.2 随机的平方
6.3 什么是随机化算法
6.4 拉斯维加斯算法
6.5 蒙特卡罗算法
6.6 素性测试
6.7 矩阵乘积验证器
6.8 随机化最小生成树算法
6.8.1 Karger-Klein-Tarjan算法
6.8.2 结点降低算法
6.8.3 线性时间最小生成树算法
6.8.4 线性时间最小生成树算法的时间成本分析
6.9 随机数的生成
6.10 随机化算法的应用
思考题
第三篇 算法分析篇
第7章 概率分析
7.1 一切都在概率中
7.2 什么是概率分析
7.3 梦幻情人的代价
7.3.1 直接分析
7.3.2 最坏情况分析
7.3.3 最好情况分析
7.3.4 平均情况分析
7.3.5 平均情况下成本的概率分析
7.3.6 概率分析结果的有效性
7.3.7 正确概率分析的保障
7.4 梦幻情人的概率
7.5 随机排列问题
7.6 跳转表问题
7.6.1 跳转表插入操作
7.6.2 随机化跳转表构建算法
7.7 南柯一梦:从无穷到无有
7.8 概率分析的其他应用
思考题
第8章 摊销分析
8.1 什么是摊销分析
8.2 摊销分析与数据结构
8.3 摊销分析的几种方法
8.4 聚类分析
8.4.1 栈操作的聚类分析
8.4.2 二进制计数器的聚类分析
8.5 会计分析
8.6 势能分析
8.6.1 栈操作的势能分析
8.6.2 二进制计数器的势能分析
8.7 摊销分析应用:表格扩展的代价
8.7.1 动态表插入操作的聚类分析
8.7.2 动态表插入操作的会计分析
8.7.3 动态表插入操作的势能分析
8.8 运气不好就摊销
思考题
第9章 竞争分析
9.1 什么是竞争分析
9.2 在线算法和离线算法
9.3 竞争力
9.4 健忘对手和优良对手
9.5 线性表更新问题
9.6 前置移动算法的竞争分析
9.7 聚类问题
9.7.1 聚类问题的次优解算法
9.7.2 CLUSTERING-ALGORITHM算法的竞争分析
9.8 竞争分析与普通算法分析
思考题
第四篇 经典算法篇
第10章 排序与次序
10.1 排序无处不在
10.2 插入排序
10.2.1 插入排序的效率分析
10.2.2 折半插入排序
10.3 归并排序
10.4 快速排序
10.4.1 快速排序的过程
10.4.2 快速排序的时间复杂性分析
10.4.3 最坏情况分析
10.4.4 最好情况分析
10.4.5 平均情况分析
10.5 随机化快速排序
10.6 排序的下限
10.7 线性排序
10.8 计数排序
10.9 基数排序
10.9.1 基数排序的正确性
10.9.2 基数排序的时间效率分析
10.10 桶排序
10.10.1 桶排序的定义
10.10.2 桶排序的正确性
10.10.3 桶排序的时间复杂性分析
10.11 次序选择
10.12 快速次序选择算法
10.13 随机快速次序选择算法
10.14 最坏情况下的线性选择算法
10.14.1 杠杆点好坏分析
10.14.2 算法时间复杂性分析
思考题
第11章 搜索与散列
11.1 搜索问题
11.2 顺序搜索
11.3 折半搜索
11.4 常数搜索
11.5 散列搜索
11.6 散列函数选择
11.6.1 直接散列
11.6.2 除法(模除法)散列
11.6.3 乘法散列
11.6.4 乘法散列的赌徒原理
11.6.5 乘方取中法
11.7 散列算法的碰撞问题
11.7.1 开放寻址散列
11.7.2 开放寻址散列的时间成本
11.7.3 开放寻址下成功搜索的时间成本
11.7.4 封闭寻址散列
11.7.5 探寻序列的设计
11.7.6 封闭寻址散列的效率分析
11.7.7 搜索不成功的时间成本
11.7.8 成功搜索的效率分析
11.8 散列表元素删除
11.9 随机化散列
11.10 全域散列
11.11 完美散列
思考题
第12章 最短路径
12.1 剑指罗马
12.2 最短路径问题
12.3 单源单点最短路径问题
12.3.1 深度优先与广度优先搜索
12.3.2 深度优先解法
12.4 单源多点最短路径问题
12.4.1 最短路径的性质
12.4.2 Dijkstra最短路径算法
12.4.3 Dijkstra算法举例
12.4.4 Dijkstra算法与洪水泛滥
12.4.5 Dijkstra算法的正确性
12.4.6 Dijkstra算法的时间复杂性
12.5 Bellman-Ford算法
12.5.1 负权重的应对方式
12.5.2 Bellman-Ford算法的正确性
12.5.3 负循环检查问题
12.5.4 Bellman-Ford算法的时间复杂性
12.6 多源多点最短路径问题
12.6.1 多源多点最短路径问题解决思路
12.6.2 直接动态规划解法
12.6.3 矩阵乘法解法
12.6.4 Floyd-Warshall算法
12.6.5 Johnson算法
12.6.6 Johnson等效变换
12.6.7 差限问题解决
12.7 天意难违
思考题
第五篇 难解与无解篇
第13章 易解与难解
13.1 我们战无不胜吗
13.2 易解与难解
13.3 决策问题和优化问题
13.4 决策问题
13.5 P类问题
13.6 NP类问题
13.7 (确定性)图灵机
13.8 非确定性图灵机
13.9 非确定性算法
13.10 回到NP类问题
13.11 P和NP
13.12 搜索问题、决策问题和优化问题
13.13 有没有解和是否可决定
思考题
第14章 NP完全问题
14.1 玉龙雪山下的审判
14.2 NP完全问题的定义
14.3 NP完全的重要性
14.4 多项式时间规约
14.5 如何证明一个问题S是NP完全问题
14.6 第1个NP完全问题的证明
14.7 库克定理
14.8 3-SAT问题
14.9 证明NP难的技巧
14.10 整数规划
14.11 独立集问题
14.12 汉密尔顿回路问题
14.13 讨论:弱NP完全、强NP完全和中NP完全
思考题
第15章 无解与近似
15.1 难解问题
15.2 不可决定问题
15.3 程序终结的判断
15.4 难解之题的求解
15.5 智能穷举、近似算法和本地搜索
15.6 智能穷举之回溯策略
15.7 智能穷举之分支限界
15.8 贪婪近似策略
15.9 启发式搜索策略
15.10 模拟退火算法
15.10.1 模拟退火算法的思想
15.10.2 模拟退火算法的基本循环
15.10.3 退火算法描述
15.11 基因/遗传算法
15.11.1 生物进化与遗传
15.11.2 遗传算法的基本要义
15.11.3 遗传算法的实现
15.11.4 遗传算法的基本运算过程
15.11.5 遗传算法的现状
15.12 概率尽在一切中
思考题
结语 算法之道
附录 算法随想
参考文献
精彩文摘:
......第1章 从无有到无穷
在第一类弗里德曼宇宙模型中,第四维—时间,正如空间一样,在范围上是有限的。它如一根具有两个端点或边界的线。因此时间具有终结,而且它也有一个开端。事实上,在宇宙具有我们观测到的物质总量的情形下,由爱因斯坦方程得出的所有解中,都有一个非常重要的特征:在过去某一时刻(大约137亿年以前)相邻星系之间的距离必须为零。换言之,整个宇宙被挤压在零尺度的单独一点,就像一个半径为零的球。那时,宇宙的密度和时空曲率都为无限大。它是我们称做大爆炸的时刻。
—摘自史蒂文·霍金《时间简史》
这个零尺度的单独一点被物理学家称做“原点”。它的另一个名字是奇异点(singularity)。但是零尺度是什么意思呢?霍金曾解释过:零尺度就是不占空间。那么不占空间是什么意思呢?也许读者猜出来了:没有(nothing)!即虚无。实际上,物理学家们普遍认为在原点之外没有空间,空间也是大爆炸后的产物。也就是说,宇宙是从无到有的,用希腊文来说就是Ex Nihilo(见图1-1)。
图1-1 Ex.Nihilo:宇宙从无到有的一刹那整个宇宙从无到有对一般人来说都很难理解,而这个原点是谁或者如何放在那里也是众说纷纭。不过,这不是本书准备要讨论的问题。本书关心的是算法,而算法具有一个与宇宙起源类似的性质:从无到有。不过这个从无到有却有着非同一般或者说更加丰富的意义,下面将详细分析。
1.1 意念与现实
先看一个例子。给你一个无限容积的罐子和无限个球,球从1开始连续编号。
在差1分钟到零点时:将标号为1~10的10个球放进罐子,然后将10号球从罐子拿出。
在差1/2分钟到零点时:将标号为11~20的10个球放进罐子,然后将20号球从罐子拿出。
在差1/4分钟到零点时:将标号为21~30的10个球放进罐子,然后将30号球从罐子拿出。
……
就这样将游戏进行下去。假定放球和取球不占时间,请问,当时钟指向零点时,罐子里还剩多少个球?
这个答案似乎很直接:无限个球!这是因为所有编号不是10n(n≥1)的球在放进去罐子里后就不会再拿出来;而在零点之前这种放球、取球的次数是无限的。因此,罐子里面的球数在零点时将是无数个。但是你很确信这个答案吗?
现在来让我们改变拿球的方式,将每次拿10、20、30、…号球分别变为拿1、2、3、…号球,即第x次拿球,所拿出来的球的编号是x。结果又会怎样呢?这个时候,神奇的事情发生了。这个罐子里面的球数将为0。我们来看,对于任意一个球,设其编号为n,则在差(1/2)n?1分钟到零点时该球将被取出。也就是说,对于任意球n,在零点时它都不在罐子里。因此,零点时罐子里球的个数为0。对于有些人来说,这个答案似乎不可接受。但又确实找不到驳斥的办法。你能找出来吗?也许这个答案是合理的,因为拿球顺序的变化使得算法发生了变化,即我们实际上讨论的是两个算法。可仔细一想又觉得不对,因为两个算法都是每次放进10个球,拿出1个球,即从根本上说,这是两个一样的算法,怎么会有截然相反的结果呢(见图1-2)图1-2 到底剩多少个球?不同的拿球顺序有不同的结果,如果我们再次改变试验中拿球的方式,将拿某个特定标号的球改为取出任意标号的球,即:
在差1分钟到零点时:将标号为1~10的10个球放进罐子,然后从罐子任意拿出一球。
在差1/2分钟到零点时:将标号为11~20的10个球放进罐子,然后从罐子任意拿出一球。
在差1/4分钟到零点时:将标号为21~30的10个球放进罐子,然后从罐子任意拿出一球。
……
这种拿球方式又将产生何种结果呢?
答案仍然是无有,即0(本书将在第1章对这个问题进行正面解析)。太不可思议了吧!这三个本质相同的算法怎么有如此匪夷所思的结果呢?如果非要说这三个算法有什么不同,那就是拿球时的标号不同。
难道是,标号的不同使最后球的数量发生了变化?
没错。就是这个标号对结果产生了深远影响。从某种意义上说,标号是虚的,它只存在于我们的想象中,但确实对现实结果产生了影响,即我们的思维使算法发生了变化。或许从另一个角度来看,这个问题就是:无有就是无穷,无穷就是无有。它们之间也许根本没有什么不同,它们的不同只存在于人们的想象或者意念中。也许这是为什么无穷的符号(是由两个0连接而成的,从左右两面看都是无有,而从中间看则是无穷,如图1-3所示。
图1-3 无有和无穷的区别也许只存在于人类的思维中从这个意义上说,算法是一种思维方式(algorithmic thinking),或者说一种哲学。而本书就是从算法思维的角度出发,阐述算法的灵魂。
1.2 什么是算法
究竟什么是算法呢?顾名思义,算法就是计算的办法或法则。这里的计算指的当然不只是加、减、乘、除等算术运算,而是广义的做任何事情的计算,而办法和法则意味着使用它就可以解决需要的问题。算法的历史可以追溯到9世纪的古波斯。最初它仅表示“阿拉伯数字的运算法则”。后来,它被赋予更一般的含义,即所谓的一组确定的、有效的、有限的解决问题的步骤。这是算法的最初定义,注意,这个定义里面没有包括“正确”。
推动算法传播的是生活在美索不达美亚的Al.Khwarizmi于9世纪一本以阿拉姆语(Aramaic)著述的教科书。该书列举了加、减、乘、除、求平方根和计算圆周率数值的方法。这些步骤的特点是:简单、没有歧义、机械、有效和正确—这就是算法。注意,这个定义加上了“正确”这个词。几百年后,当十进制计数法在欧洲被广泛使用时,“算法”(algorithm)这个单词被人们创造出来以纪念Al Khwarizmi先生。
由上面提到的定义可推知,算法作为解决问题的方法,它必须具备以下特点:·确定性,即无歧义,能让人照着执行。
·可行性,算法中的运算都是基本的,理论上能够由人用纸和笔完成。
·有限性,在有限输入下,算法必须能在有限步骤内实现有限输出。
此外,算法必须有输出、计算的结果,通常还有至少一个输入量。这是因为算法用以解决的问题的描述均包括输入和输出。
……
特别备注:
1.来源于网络,仅用于分享知识,学习和交流!请下载完在24小时内删除。2.禁用于商业用途!如果您喜欢《算法之道(第2版)》,请购买正版,谢谢合作。
3.爱学习,请到3322软件站查找资源自行下载!
下载说明:
方法一:1、下载并解压,得出pdf文件
2、如果打不开本文件,别着急,这时候请务必在3322软件站选择一款阅读器下载哦
3、安装后,再打开解压得出的pdf文件
4、以上都完成后,接下来双击进行阅读就可以啦,朋友们开启你们的阅读之旅吧。
方法二:
1、可以在手机里下载3322软件站中的阅读器和百度网盘
2、接下来直接将pdf传输到百度网盘
3、用阅读器打开即可阅读
展开更多
算法之道(第2版)-邹恒明pdf高清扫描版下载地址
- 需先下载高速下载器:
- 专用下载:
- 其它下载: