算法之道(第2版)

当前位置:首页 > 计算机网络 > 计算机理论 > 算法之道(第2版)

出版社:机械工业出版社华章公司
出版日期:2012-4-20
ISBN:9787111370505
作者:邹恒明
页数:323页

章节摘录

版权页:第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先生。由上面提到的定义可推知,算法作为解决问题的方法,它必须具备以下特点:•确定性,即无歧义,能让人照着执行。•可行性,算法中的运算都是基本的,理论上能够由人用纸和笔完成。•有限性,在有限输入下,算法必须能在有限步骤内实现有限输出。此外,算法必须有输出、计算的结果,通常还有至少一个输入量。这是因为算法用以解决的问题的描述均包括输入和输出。

前言

前言:起初神创造天地。地是空虚混沌,渊面黑暗;神的灵运行在水面上。神说:"要有光。”就有了光。神看光是好的,就把光与暗分开了。神称光为昼,暗为夜。有晚上,有早晨,这是头一日。……神就照着自己的形象造人。……神说:"看啊!我将遍地上一切结种子的菜蔬和一切树上所结有核的果子,全赐给你们做食物。至于地上的走兽和空中的飞鸟,以及各样在地上爬的有生命的物,我将青草赐给它们做食物。"事就这样成了。神看着一切所造的都甚好。有晚上,有早晨,是第六日。天地万物都造齐了。6天圣经上写着:神6天创造天地万有,第7日安歇。对于神创论者来说,这是不可怀疑的事实。但对于进化论者来说,6天创造一切根本就不可能。作为一本算法书,我们当然不打算加入神创论和进化论者的永无休止的争论当中去。我们关心的是这么一个问题:圣经上为什么给出的是6天,而不是其他的时间长度。不管是神创论者还是进化论者,弄清楚6这个数字的来历很可能会对己方的观点有所帮助。在这6天里,神将他的创作方程式重复了6次,每天1次。对于全能的神来说,他完全可以在1天、1秒或者任何他所愿意的时间长度里创造天地万物,但却为什么是不多不少的6天呢?而不管圣经上的“1天”是多长,这个问题都是值得讨论的。我们知道,任何一个自然数的约数中都有1和它本身,而所有小于它本身的因数叫做这个自然数的真约数。例如,6的所有真约数是1、2、3;数字8的真约数是1、2、4。如果一个数的真约数之和等于这个自然数本身,则这个自然数就称为完全数,或者完美数。例如,6=1+2+3,因此6是完美数;而8(1+2+4,因此8不是完美数。因此,神6天创造世界,暗示着该创造是完美的!以完美数来昭示创造的完美,似乎合情合理。但问题是,完美数只有6这一个数吗?如果不是,为什么不使用其他的完美数呢?答案是,完美数虽然不只有6这一个,但确实数量稀少。一直到现在(2009年6月),数学家们探索了2600年,并且现代数学家们还借助了超级计算机的帮助,但也仅仅找到了47个完美数。其中第1个完美数是6,接下来的4个完美数分别是:28、496、8128、33550336。而第47个完美数有25956377个数位(注意,是数位,不是数值),它的数值为:243112608×(243112609?1)。完美数的稀少昭示着达到完美的难度,而神选择6天来创造天地万有也许是因为6是最小的完美数,即创造天地万有对于神来说是轻而易举的一件事情……完美与算法完美数由于其各种神秘属性(真约数之和等于自身只是其中的一种性质)而受到了特殊的关注。但到底哪些数是完美数则不是一件容易判断的事情。显然,按照完美数的定义,判断一个数是否是完美数的不二法则是找出它的所有真约数,然后求和看看其是否等于自身。而这种方法效率太过低下,因为这意味着因式分解,而这是十分困难的(本书后面将会讨论到这个问题)。如果判断一个数是否是完美数就已经非常困难,那么要找出所有的完美数则更是一个难上加难的任务。因为这就意味着将所有的数进行上面描述的判断验证:因式分解。这似乎是人类不可能完成的任务。即使用世界上超快的计算机来进行计算,情况也不会有任何数量级的改善。显然,我们需要新的解决方案,而不是发明或使用新的计算工具!研究这样的解决方案就可以归结到算法的范畴里,因为如何高效地解决问题正是算法要研究的核心课题。有意思的是,判断和搜索完美数是算法的研究范畴,而算法本身的追求却也是“完美”。算法无处不在如果你觉得算法只是用来研究解决找出完美数之类的“漫无边际的问题”,那就大错特错了。也许算法这个名词听上去很抽象,让人联想不到任何具体的物体。也许你会觉得算法与自己的生活并无太多关系,它只不过存在于那些闲得无聊的数学家或计算机专业人士的脑海中。但事实真是这样吗?当然不是。如果我们告诉你算法就是解决各种问题的方法,你就不会觉得它太抽象,与生活无关了吧。事实是,算法无处不在。每个人每天都在使用不同的算法来活出自己的人生,比如你去食堂买饭会选择一个较短的队列,而有人则可能选择一个推进速度更快的队列。每天起床后,你可能先读一会儿书,再去吃早饭;另外一个人则可能先去吃早饭,然后再看书。所有这些行为都是算法或算法一部分的体现。也许运行这些算法并不在你的思想意识里,也许你并不知道算法在帮助自己的生活,但它确实存在。这些算法也许没有经过精心设计,没有经过仔细分析,但它还是算法!2009年7月23日下午,我在游览云南省大理市的蝴蝶泉时由于泉水边的石头很滑,在用泉水洗手时(导游金花说用该泉水洗手会带来好运)不慎滑落到蝴蝶泉水(见图3)里面全身湿透。(据说一天至多只会有一个人滑落到泉里,可见我的运气不错!看来“蝴蝶泉边好梳妆”的歌词也许应该改为“蝴蝶泉里好冲凉”。)泉水冰冷透凉,而大理的气温又低。这样,我就面临一个是否更换全身衣服的选择。问题是,旅游团需要马上赶去登游船游览洱海风光,而若找地方或者回旅店换衣服就将赶不上游船。如何处理这件事情就是一个算法问题:是先上游船再在船上找地方换衣服,还是找个地方换衣服而放弃游览苍山洱海。显然不同的算法有着不同的收益和代价。如果能够在游船上找到合适的地方更换衣服,则采用先上游船再换衣服的算法为佳;否则就是放弃游览的算法更好,因为如果冻病了显然就不划算了。最后,我选择了在游船上更换衣服的算法:在游船上找到了一个贵宾室更衣。算法由问题驱动算法的发现总是由相关的问题驱动的。拿排序来说,因为生活中到处都充满次序,每个人都要接受自己在某个次序里的位置。比如,各种排名、评优、民意调查等,最后的结果都体现为一个次序!看来,“没有次序无以成方圆”并不是空穴来风!而谈到排序用的方法,人们很自然地想到了插入法。因为这种朴素的算法和人的思维方式非常类似:它就是人们打牌时整理手中扑克牌的算法。但是随着数据量的增多,插入排序的效率缺陷迅速变为人们无法容忍的缺点。于是人们发明了归并排序、堆排序、快速排序等,这些排序的方法大大改善了速度,但是人们却并不满足于此,因此又发明了效率更高的线性排序。表1给出的是各种排序算法平均情况下的效率比较:最上面一行的数字代表输入的规模,如10表示一共有10个数据项,1M表示一共有100万个数据项。其他格子里面的数据为相应算法在相应输入规模下完成排序所需要的时间,单位为毫秒。所有输入数据为随机产生。一个个新的算法都是为了解决前面算法遗留的问题而产生的。从表1里的数字可以看出,一般来说,随着新的算法出现,排序效率在不断提高。不过,虽然每个算法似乎解决了前面算法的遗留问题,但新的问题也会被有意或无意地引入。例如,线性排序虽然将排序的时间复杂性降低到线性级,但各种前提条件极大地限制了其应用范围。也许这就是算法永远也不能或不会停止发展的一个原因吧。算法是计算机的灵魂因为人不是全能的,一个时刻只能做一件事情,所以做事情就要有一个步骤。由于算法要满足人的这种特性,因此它通常表示为一个做事情的行为序列。因此,从一般意义上说,算法就是求解问题的步骤。由于计算机的计算操作完全是一步一步进行,因此算法的上述性质用于计算机是再合适不过了,可以说算法弥漫在计算机的一切行为上。如果说操作系统是计算机的心智,那么算法就是计算机的灵魂。理解灵魂当然不是一件容易的事情,由于它高度抽象与简洁,许多学生都望而却步。先看一个纸牌魔术:1)任选一位观众将一副扑克牌充分洗好。2)背对观众,请观众随机抽出一张牌,记住牌面,然后将这张牌放回整副牌的最上面。3)接过牌后,洗牌几次。洗牌的时候保持最上面一张牌不动。4)对观众说:“我来教你魔法,只要吹一口气,就能把刚才你抽的牌吹到任意位置上”。5)请观众说出一个数字,比如说10,然后一边吹气,一边想着刚才说的数字10。6)在吹完气后,请观众一张一张地将上面的牌取出放在桌上。7)到第10张时,将牌翻开,发现并不是其原来抽的牌。8)接回整副牌,并把上一个步骤里取出堆放在桌上的牌收起,仍放在整副牌的最上面。9)然后洗牌几次,洗牌的时候保持上面放回来的那堆牌不动。10)从观众手上拿回刚才翻开的那张牌,插入最上面9个位置中的任意一个。11)对观众说:“你刚才不是在想着那个数字的时候吹的气,而是在吹气的时候想着那个数字,而这是完全不同的两回事。我现在演示如何吹气。”对着牌吹一口气。12)请观众从上到下数牌,到第10张时翻开。13)这张翻开的牌就是观众一开始抽的那张牌。读者看明白了上面的这个魔术了吗?这里面隐藏着一个算法。如果看懂了就可以在朋友面前一显身手了。当然,如果没有看懂也没有什么关系。算法本来就不是轻易让人看懂的嘛。如果这些问题读者都能回答,那么恭喜你。看来算法分析对于读者来说将是件很容易的事情,不过可能也不一定。如果你回答不出这些问题,不用担心,因为回答诸如此类的问题就是本书的目的。当然了,本书回答的远不止这么几个简单问题,而是会阐述更重要的算法精髓:算法思想、战略和分析!

内容概要

邹恒明,美国密歇根大学(University of Michigan-Ann Arbor)计算机科学与工程博士、中国科学院计算技术研究所硕士、华中科技大学计算机科学与技术学士。曾先后在美国IBM、美国国家数据公司、美国朗讯和美国EMC公司任职8年多。现为上海交通大学教授。

书籍目录

前言
第一篇 算法基础篇
第1章 从无有到无穷
3
1.1 意念与现实
4
1.2 什么是算法
5
1.3 算法的表示
7
1.4 算法之魂
8
1.5 如何比较速度
9
1.6 算法与计算机的关系
10
1.7 算法的范畴
11
1.8 为什么学习算法
11
思考题
12
第2章 计数与渐近
13
2.1 算法的分析
13
2.1.1 正确性分析
14
2.1.2 时空效率分析
15
2.1.3 时空特性分析
15
2.2 计数:算法分析的核心
15
2.3 算法设计
16
2.4 算法效率表示
17
2.5 渐近分析
18
2.6 O、?、(表示
19
2.7 最好、最坏、平均
20
2.8 O、?、(的另一类定义
22
2.9 O、?、( 的性质
23
2.10 要更快的计算机还是要更快的算法
23
思考题
24
第3章 分治与递归
27
3.1 分而治之为上策
28
3.2 分治策略
30
3.3 递归表达式求解
31
3.3.1 递归树法
31
3.3.2 替换解法
32
3.3.3 大师解法
34
3.4 分治策略举例1:乘方运算
37
3.5 生命中不能承受之重:矩阵乘法
37
3.6 魔鬼序列:斐波那契序列
40
3.6.1 由底至上
42
3.6.2 使用通式
42
3.6.3 使用矩阵乘方
42
3.7 VLSI 布线
43
3.8 多项式乘法
44
3.9 分治就在潜意识
44
思考题
45
第二篇 算法设计篇
第4章 动态规划思想
49
4.1 什么是动态规划
51
4.2 流水线问题
51
4.3 最长公共子序列
55
4.3.1 第一种解法:蛮力策略
56
4.3.2 第二种解法:动态规划
57
4.4 最长公共子序列变种
59
4.5 记忆递归法
59
4.6 空间效率改善
60
4.7 最优二叉搜索树
60
4.7.1 递归解法
63
4.7.2 计算最优答案
64
4.8 最优子结构与重叠子问题
66
4.8.1 最优子结构
67
4.8.2 重叠子问题
67
4.9 动态规划与静态规划的关系
68
4.10 动态规划与静态规划的相互转换
69
思考题
69
第5章 贪婪选择思想
71
5.1 仅有动态规划是不够的
71
5.2 什么是贪婪
72
5.3 背包问题
72
5.4 贪婪选择属性
75
5.5 教室规划问题
75
5.6 最小生成树
79
5.6.1 Kruskal算法的正确性
83
5.6.2 Kruskal算法的时间分析
83
5.7 Prim算法
84
5.8 霍夫曼树和霍夫曼编码
87
5.8.1 霍夫曼树
89
5.8.2 霍夫曼编码
90
5.8.3 霍夫曼编码的无前缀编码性质
91
5.9 进程调度问题
92
5.10 贪婪选择属性
92
5.11 标准分治、动态规划和贪婪选择的比较
94
思考题
95
第6章 随机化思想
97
6.1 为什么要随机化
98
6.2 随机的平方
99
6.3 什么是随机化算法
100
6.4 拉斯维加斯算法
101
6.5 蒙特卡罗算法
102
6.6 素性测试
103
6.7 矩阵乘积验证器
105
6.8 随机化最小生成树算法
107
6.8.1 Karger-Klein-Tarjan算法
108
6.8.2 结点降低算法
109
6.8.3 线性时间最小生成树算法
109
6.8.4 线性时间最小生成树算法的时间成本分析
109
6.9 随机数的生成
110
6.10 随机化算法的应用
111
思考题
111
第三篇 算法分析篇
第7章 概率分析
115
7.1 一切都在概率中
116
7.2 什么是概率分析
117
7.3 梦幻情人的代价
117
7.3.1 直接分析
119
7.3.2 最坏情况分析
119
7.3.3 最好情况分析
120
7.3.4 平均情况分析
120
7.3.5 平均情况下成本的概率分析
120
7.3.6 概率分析结果的有效性
121
7.3.7 正确概率分析的保障
122
7.4 梦幻情人的概率
122
7.5 随机排列问题
124
7.6 跳转表问题
126
7.6.1 跳转表插入操作
128
7.6.2 随机化跳转表构建算法
128
7.7 南柯一梦:从无穷到无有
130
7.8 概率分析的其他应用
132
思考题
132
第8章 摊销分析
135
8.1 什么是摊销分析
136
8.2 摊销分析与数据结构
137
8.3 摊销分析的几种方法
138
8.4 聚类分析
138
8.4.1 栈操作的聚类分析
139
8.4.2 二进制计数器的聚类分析
140
8.5 会计分析
141
8.6 势能分析
143
8.6.1 栈操作的势能分析
144
8.6.2 二进制计数器的势能分析
144
8.7 摊销分析应用:表格扩展的代价
145
8.7.1 动态表插入操作的聚类分析
147
8.7.2 动态表插入操作的会计分析
148
8.7.3 动态表插入操作的势能分析
149
8.8 运气不好就摊销
150
思考题
151
第9章 竞争分析
153
9.1 什么是竞争分析
153
9.2 在线算法和离线算法
154
9.3 竞争力
156
9.4 健忘对手和优良对手
156
9.5 线性表更新问题
157
9.6 前置移动算法的竞争分析
159
9.7 聚类问题
161
9.7.1 聚类问题的次优解算法
162
9.7.2 CLUSTERING-ALGORITHM算法的竞争分析
162
9.8 竞争分析与普通算法分析
163
思考题
163
第四篇 经典算法篇
第10章 排序与次序
169
10.1 排序无处不在
169
10.2 插入排序
170
10.2.1 插入排序的效率分析
172
10.2.2 折半插入排序
172
10.3 归并排序
173
10.4 快速排序
175
10.4.1 快速排序的过程
175
10.4.2 快速排序的时间复杂性分析
177
10.4.3 最坏情况分析
177
10.4.4 最好情况分析
177
10.4.5 平均情况分析
178
10.5 随机化快速排序
179
10.6 排序的下限
181
10.7 线性排序
182
10.8 计数排序
183
10.9 基数排序
186
10.9.1 基数排序的正确性
187
10.9.2 基数排序的时间效率分析
187
10.10 桶排序
189
10.10.1 桶排序的定义
190
10.10.2 桶排序的正确性
190
10.10.3 桶排序的时间复杂性分析
191
10.11 次序选择
192
10.12 快速次序选择算法
193
10.13 随机快速次序选择算法
195
10.14 最坏情况下的线性选择算法
197
10.14.1 杠杆点好坏分析
198
10.14.2 算法时间复杂性分析
198
思考题
199
第11章 搜索与散列
201
11.1 搜索问题
202
11.2 顺序搜索
203
11.3 折半搜索
204
11.4 常数搜索
205
11.5 散列搜索
206
11.6 散列函数选择
207
11.6.1 直接散列
208
11.6.2 除法(模除法)散列
208
11.6.3 乘法散列
209
11.6.4 乘法散列的赌徒原理
210
11.6.5 乘方取中法
211
11.7 散列算法的碰撞问题
211
11.7.1 开放寻址散列
212
11.7.2 开放寻址散列的时间成本
212
11.7.3 开放寻址下成功搜索的时间成本
213
11.7.4 封闭寻址散列
214
11.7.5 探寻序列的设计
215
11.7.6 封闭寻址散列的效率分析
217
11.7.7 搜索不成功的时间成本
217
11.7.8 成功搜索的效率分析
219
11.8 散列表元素删除
219
11.9 随机化散列
220
11.10 全域散列
221
11.11 完美散列
224
思考题
227
第12章 最短路径
231
12.1 剑指罗马
231
12.2 最短路径问题
233
12.3 单源单点最短路径问题
235
12.3.1 深度优先与广度优先搜索
235
12.3.2 深度优先解法
237
12.4 单源多点最短路径问题
238
12.4.1 最短路径的性质
239
12.4.2 Dijkstra最短路径算法
240
12.4.3 Dijkstra算法举例
241
12.4.4 Dijkstra算法与洪水泛滥
242
12.4.5 Dijkstra算法的正确性
243
12.4.6 Dijkstra算法的时间复杂性
245
12.5 Bellman-Ford算法
246
12.5.1 负权重的应对方式
247
12.5.2 Bellman-Ford算法的正确性
250
12.5.3 负循环检查问题
251
12.5.4 Bellman-Ford算法的时间复杂性
252
12.6 多源多点最短路径问题
252
12.6.1 多源多点最短路径问题解决思路
252
12.6.2 直接动态规划解法
253
12.6.3 矩阵乘法解法
255
12.6.4 Floyd-Warshall算法
255
12.6.5 Johnson算法
256
12.6.6 Johnson等效变换
257
12.6.7 差限问题解决
259
12.7 天意难违
260
思考题
261
第五篇 难解与无解篇
第13章 易解与难解
265
13.1 我们战无不胜吗
266
13.2 易解与难解
266
13.3 决策问题和优化问题
267
13.4 决策问题
268
13.5 P类问题
269
13.6 NP类问题
269
13.7 (确定性)图灵机
270
13.8 非确定性图灵机
271
13.9 非确定性算法
271
13.10 回到NP类问题
272
13.11 P和NP
273
13.12 搜索问题、决策问题和优化问题
274
13.13 有没有解和是否可决定
275
思考题
276
第14章 NP完全问题
277
14.1 玉龙雪山下的审判
277
14.2 NP完全问题的定义
278
14.3 NP完全的重要性
279
14.4 多项式时间规约
280
14.5 如何证明一个问题S是NP完全问题
281
14.6 第1个NP完全问题的证明
281
14.7 库克定理
281
14.8 3-SAT问题
284
14.9 证明NP难的技巧
285
14.10 整数规划
286
14.11 独立集问题
287
14.12 汉密尔顿回路问题
289
14.13 讨论:弱NP完全、强NP完全和中NP完全
293
思考题
293
第15章 无解与近似
295
15.1 难解问题
296
15.2 不可决定问题
296
15.3 程序终结的判断
297
15.4 难解之题的求解
298
15.5 智能穷举、近似算法和本地搜索
299
15.6 智能穷举之回溯策略
301
15.7 智能穷举之分支限界
302
15.8 贪婪近似策略
302
15.9 启发式搜索策略
303
15.10 模拟退火算法
305
15.10.1 模拟退火算法的思想
306
15.10.2 模拟退火算法的基本循环
306
15.10.3 退火算法描述
307
15.11 基因/遗传算法
308
15.11.1 生物进化与遗传
309
15.11.2 遗传算法的基本要义
309
15.11.3 遗传算法的实现
310
15.11.4 遗传算法的基本运算过程
313
15.11.5 遗传算法的现状
314
15.12 概率尽在一切中
314
思考题
315
结语 算法之道
317
附录 算法随想
321
参考文献
324

编辑推荐

《算法之道(第2版)》既可以作为大学本科或研究生的算法教材或参考书,也可以作为对算法有兴趣的读者提升认知深度的读物。

作者简介

本书追求的目标是算法背后的逻辑,是一本启示书,而不是一本包罗万象的算法大全。因此,本书甄选了那些最能展现算法思想、战略和精华,并能够有效训练算法思维的内容。本书将算法的讨论分为五篇:算法基础篇、算法设计篇、算法分析篇、经典算法篇、难解与无解篇。每篇分别讨论算法的一个方面:基础、设计、分析、经典和难解问题。第2版还对进程调度问题、跳转表问题、概率分析应用、遗传算法等方面进行了论述。
本书既可以作为大学本科或研究生的算法教材或参考书,也可以作为对算法有兴趣的读者提升认知深度的读物。

图书封面


 算法之道(第2版)下载 精选章节试读 更多精彩书评



发布书评

 
 


精彩书评 (总计2条)

  •     10.2.2 折半插入排序 173页 在插入排序的每一轮寻找插入位置的时候,使用折半查找。作者认为整个算法的效率从O(n^2)降为O(n log n)。明显错了,作者忘了找到插入位置之后,还需要移动数据。把移动数据的时间算上,仍然为O(n^2)
  •     讲解的内容比较有意思,比较清晰,但是有的内容可能要求数学功底比较高……有些看不懂……主要讲解了各种算法的思想,还有证明,比较严谨关于教科书中的有些算法介绍不完全,比如堆排序什么的,没有介绍抱歉,你的评论太短了抱歉,你的评论太短了抱歉,你的评论太短了抱歉,你的评论太短了

精彩短评 (总计67条)

  •     易懂,简单,不适合专业要求高的,可参考。
  •     一般般,没什么实践性
  •     很好,里面讲的不是很难,连非计算机专业的也能看懂
  •     内容一般般 硬伤是太得瑟了
  •     算法这东西就得静下心慢慢研读
  •     令我惊讶的是, 给职业人员看的书, 十岁的女儿也愿意看!可以作者和译者的功底!
  •     很有特色有自己的想法
  •     这本书有作者自己的想法,很好,
  •     课上老师推荐的,很值得一读
  •     学习编程相关的算法
  •     还可以.但是感觉有点难.有时候看不大懂
  •     不错, 是一本好书
  •     虽然没怎么看,感觉很好
  •     RT,哈哈
  •     算法之道 第2版(决战大数据时代!IT技术人员不得不读!) 学习学习 看看 还好吧
  •     买过第一版,买来第二版继续学习!
  •     书不错,讲得很生动
  •     作者对于算法有自己的心得。书还不错。
  •     我是第一次接触算法,这本书让我对算法有了一个深刻的理解,感谢作者。
  •     买了后不会觉得后悔
  •     真的写的非常好,不是对你灌输算法的本身,而是让你亲自体会算法的魅力。在这本书里,算法不再是枯燥无味而是活灵活现,是人类智力的结晶,作者很用心,强烈推荐。
  •     大概翻了下,有点薄
  •     把买来的这本 书与自己在图书馆借的那本《操作系统之哲学原理》比较了一下,感觉买的这本纸张要差,而且字体排版也相对不好。
  •     把枯燥的知识,讲诉的如此生动的书籍不多,推荐大家看看吧!
  •     挺好详细
  •     论述很有高度,高屋建瓴,和《操作系统的哲学原理》堪称双璧另当当的送货真是好,提前一天,一大早就到了,这么热的天,谢谢了,辛苦了
  •     内容不错,讲的挺好的
  •     尽管大学学了数据结构、算法设计、并行算法、计算复杂性等课程,但这本书无论从广度还是深度,都很有分量,将将复杂问题简单化、清晰化、条理化。值得一读!
  •     学习算法的一个好的选择,还可领率一下人生的真谛。
  •     风趣、幽默,深入浅出
  •     很好的书,把复杂的理论简单化,枯燥的理论故事化
  •     不错的书,要仔细看
  •     导师写的一本书,读过他的《计算机的心智——操作系统的哲学原理》,受益匪浅,讲述的内容清晰,易懂,里面的小故事很有趣味,也能引发一些思考。买来这本书准备当做课程之外的辅助学习资料,里面的小故事真的很有意思。
  •     一本用心写出的好书
  •     如题. 不喜欢其中的神神叨叨!
  •     里面有不少机器学习需要用到的经典算法
  •     偏思想,专业性不是很强。入门可以!
  •     看了几章;书确实不错,通俗易通,生动有趣。但是可惜,后来发现晚上有电子版本。书,好贵啊。
  •     还算不错的
  •     挺不错的书,用通俗易懂的语言讲解算法,非常适合入门的时候使用
  •     辛苦的二次评论:
    这本书有点类似MIT算法导论的讲义,比较通俗易懂了,适合我这样自己学的。
  •     很不错的选择,是学习算法的一个好的选择
  •     看过第一版的一点,觉得写得很好就买了
  •     内容不错,包装完整
  •     介绍了大部分算法的思想,巩固以前的知识,作为一份工作参考书是不错的。
  •     非常好的算法书
  •     快递把书放到桌上然后迅速地消失了,拆开看,书是湿的,皱得很厉害,都快发霉了。
    当当退书手续相当麻烦,还是算了,书虽便宜,买了没保障
  •     此书我正在研究,很期待能够给我启迪
  •     算法部分的介绍很不错,可以作为一本入门教材。例子大多是经典的,算法导论/编程之美都有过,但是作者由浅入深的分析和说教还是很方便理解的。
  •     文例颇有风韵
  •     本书内关于谈恋爱很划算的例子很精彩...
  •     人生到处都是哲学,包括计算机科学在内。用哲学描述和解释抽象的事物能使人更深地了解本质。我先前买的《操作系统之哲学原理》,也体现了作者邹恒明先生的这一写作风格。
  •     量不是很多
  •     适合当参考书,可读性好,但在理论性和实践性上都有欠缺。
  •     很灵活
  •     图书促销的时候买的 实用
  •     新版了~强烈推荐~
  •     第一次在当当上面买书,很好很快
  •     这个应某人要求买的,很厚的一本,我也不懂,据说还不错
  •     讲解算法别具一格,有其独到之处,不同凡响。
  •     没时间看MIT那本大部头算法导论的看这个不错,很多例子都一样的
  •     翻阅了一遍,感觉就像是听作者讲故事,初学者会在不知不觉中认识了算法。对于从事教学的老师来说,可以借鉴邹老师的文法,将抽象的概念具象化,将枯燥的理论生动化。不过对比了第二版和第一版,两者在结构和叙述上只有细微差别,第二版也只比第一版多20页,价格却比第一版贵了20元。
  •     不仅可以学到算法知识,还可领率一下人生的真谛
  •     算法必备~~~~
  •     这本书值得看看!
  •     有意思适合有一点基础的人看
  •     有值得推敲的东西
 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024