具体描述
《算法基础》自1997年出版以来深受读者喜爱,已经被翻译成多种语言出版,并成为世界许多高校广泛采用的算法教材之一。书中对算法设计、算法的复杂度分析和计算复杂度进行了恰如其分的介绍。作者用平实的语言和简单的符号介绍了各种抽象的数学概念,既浅显易懂,又不失严谨。为了便于读者理解和记忆,作者还提供了大量的示例,并在附录中介绍了基本的数学概念。
第5版新增了一章,介绍遗传算法和遗传编程,其中提供了理论和实践两方面的应用。此外,这一版还对练习和示例进行了全面更新,并且改进了教师资源。本书可作为本科生和研究生算法课程的教材,也可供程序员及算法分析和设计人员阅读。
作者简介
Richard E. Neapolitan
美国东北伊利诺伊大学计算机科学教授,C Suite Consulting Group贝叶斯网络和统计学研究员。研究方向包括:概率与统计、人工智能、认知科学,以及贝叶斯网络和概率建模在医学、生物和金融领域的应用。他是国际知名的理论家和实践者,并受邀在世界各地发表讲演、举办研讨会。Neapolitan还是一位多产的作家,另著有《专家系统的概率推理》《学习贝叶斯网络》《当代人工智能》等专著。
目录信息
1.1 算法 1
1.2 开发高效算法的重要性 5
1.2.1 顺序查找与二分查找的对比 6
1.2.2 斐波那契序列 7
1.3 算法分析 10
1.3.1 复杂度分析 10
1.3.2 理论应用 14
1.3.3 正确性分析 15
1.4 阶 15
1.4.1 阶的直观介绍 15
1.4.2 阶数的严谨介绍 17
1.4.3 利用极限计算阶 23
1.5 本书概要 25
1.6 习题 25
第2章 分而治之 30
2.1 二分查找 30
2.2 合并排序 33
2.3 分而治之方法 38
2.4 快速排序(分割交换排序) 38
2.5 Strassen矩阵乘法算法 42
2.6 大整数的算术运算 46
2.6.1 大整数的表示:加法和其他线性时间运算 46
2.6.2 大整数的乘法 46
2.7 确定阈值 50
2.8 不应使用分而治之方法的情况 53
2.9 习题 53
第3章 动态规划 58
3.1 二项式系数 58
3.2 Floyd最短路径算法 61
3.3 动态规划与最优化问题 66
3.4 矩阵链乘法 67
3.5 最优二叉查找树 73
3.6 旅行推销员问题 79
3.7 序列对准 84
3.8 习题 88
第4章 贪婪方法 92
4.1 最小生成树 94
4.1.1 Prim算法 96
4.1.2 Kruskal算法 100
4.1.3 Prim算法与Kruskal算法的比较 103
4.1.4 最终讨论 103
4.2 单源最短路径的Dijkstra算法 104
4.3 调度计划 106
4.3.1 使系统内总时间最短 106
4.3.2 带有最终期限的调度安排 108
4.4 霍夫曼编码 112
4.4.1 前缀码 113
4.4.2 霍夫曼算法 114
4.5 贪婪方法与动态规划的比较:背包问题 116
4.5.1 0-1背包问题的一种贪婪方法 116
4.5.2 部分背包问题的贪婪方法 118
4.5.3 0-1背包问题的动态规划方法 118
4.5.4 0-1背包问题动态规划算法的改进 118
4.6 习题 120
第5章 回溯 124
5.1 回溯方法 124
5.2 n皇后问题 129
5.3 用蒙特卡洛算法估计回溯算法的效率 132
5.4 “子集之和”问题 134
5.5 图的着色 138
5.6 哈密顿回路问题 141
5.7 0-1背包问题 143
5.7.1 0-1背包问题的回溯算法 143
5.7.2 比较0-1背包问题的动态规划算法与回溯算法 149
5.8 习题 150
第6章 分支定界 153
6.1 用0-1背包问题说明分支定界 154
6.1.1 带有分支定界修剪的宽度优先查找 154
6.1.2 带有分支定界修剪的最佳优先查找 158
6.2 旅行推销员问题 161
6.3 溯因推理(诊断) 167
6.4 习题 173
第7章 计算复杂度介绍:排序问题 175
7.1 计算复杂度 175
7.2 插入排序和选择排序 176
7.3 每次比较最多减少一个倒置的算法的下限 179
7.4 再谈合并排序 181
7.5 再谈快速排序 185
7.6 堆排序 186
7.6.1 堆和基本堆例程 186
7.6.2 堆排序的一种实现 189
7.7 合并排序、快速排序和堆排序的比较 193
7.8 仅通过键的比较进行排序的下限 194
7.8.1 排序算法的决策树 194
7.8.2 最差情况下的下限 196
7.8.3 平均情况下的下限 197
7.9 分配排序(基数排序) 200
7.10 习题 203
第8章 再谈计算复杂度:查找问题 207
8.1 仅通过键的比较进行查找的下限 207
8.1.1 最差表现的下限 209
8.1.2 平均情况下的下限 210
8.2 插值查找 213
8.3 树中的查找 215
8.3.1 二叉查找树 215
8.3.2 B树 218
8.4 散列 219
8.5 选择问题:对手论证 222
8.5.1 找出最大键 222
8.5.2 同时找出最大键和最小键 223
8.5.3 找出第二大的键 227
8.5.4 查找第k小的键 230
8.5.5 选择问题的一种概率算法 236
8.6 习题 238
第9章 计算复杂度和难解性:NP 理论简介 241
9.1 难解性 241
9.2 再谈输入规模 242
9.3 三类一般问题 244
9.3.1 已经找到多项式时间算法的问题 244
9.3.2 已经证明难解的问题 245
9.3.3 未被证明是难解的,但也从来没有找到多项式时间算法的问题 245
9.4 NP理论 245
9.4.1 集合P和NP 247
9.4.2 NP完全问题 250
9.4.3 NP困难、NP容易和NP等价问题 256
9.5 处理NP困难问题 259
9.5.1 旅行推销员问题的近似算法 259
9.5.2 装箱问题的近似算法 263
9.6 习题 266
第10章 遗传算法和遗传编程 268
10.1 遗传知识复习 268
10.2 遗传算法 270
10.2.1 算法 270
10.2.2 说明范例 270
10.2.3 旅行推销员问题 272
10.3 遗传编程 278
10.3.1 说明范例 279
10.3.2 人造蚂蚁 281
10.3.3 在金融贸易中的应用283
10.4 讨论及扩展阅读 284
10.5 习题 284
第11章 数论算法 286
11.1 数论回顾 286
11.1.1 合数与质数 286
11.1.2 最大公约数 286
11.1.3 质因数分解 288
11.1.4 最小公倍数 289
11.2 计算最大公约数 290
11.2.1 欧氏算法 290
11.2.2 欧氏算法的扩展 292
11.3 模运算回顾 294
11.3.1 群论 294
11.3.2 关于n同余 295
11.3.3 子群 299
11.4 模线性方程的求解 302
11.5 计算模的幂 305
11.6 寻找大质数 307
11.6.1 寻找大质数 307
11.6.2 检查一个数字是否为质数 307
11.7 RSA公钥密码系统 318
11.7.1 公钥加密系统 318
11.7.2 RSA加密系统 319
11.8 习题 321
第12章 并行算法简介 324
12.1 并行体系结构 325
12.1.1 控制机制 326
12.1.2 地址空间的组织 326
12.1.3 互联网络 328
12.2 PRAM模型 330
12.2.1 为CREW PRAM模型设计算法 332
12.2.2 为CRCW PRAM模型设计算法 337
12.3 习题 339
附录A 必备数学知识回顾 340
附录B 求解递归方程:在递归算法分析中的应用 363
附录C 不交集的数据结构 388
参考文献 395
· · · · · · (收起)
读后感
用户评价
坦白说,我拿到这本书之前,对于“算法”这个词,总有一种莫名的距离感,觉得它离我的实际工作很遥远。但读了这本书之后,我的看法彻底改变了。作者用非常贴近实际的例子,将那些看似高深的算法,比如二叉树、堆、图算法等,与我们日常生活中遇到的各种问题联系起来。比如,讲到图的连通性时,作者用社交网络的好友关系来做比喻,瞬间就让我觉得那些理论不再是冰冷的符号。而且,书中对于不同算法的优劣势分析,也特别实在,不是那种纯粹的理论比较,而是会考虑到实际应用中的效率、内存消耗等方面。我甚至觉得,这本书可以作为我准备面试时的“秘密武器”,因为它不仅能让我掌握算法的原理,还能让我理解如何在面试官面前清晰地阐述算法的思路和权衡。对我来说,这本书最大的价值在于,它消除了我对算法的恐惧,让我觉得算法原来是可以理解,并且非常实用的。
这本书给我带来的最大震撼,在于它对算法的“思想”进行了深刻的剖析。我一直觉得,学习算法,光是记住一些公式和代码是不够的,关键在于理解其背后的设计哲学和解决问题的思路。而这本书恰恰在这方面做得非常出色。它没有简单地罗列算法,而是深入探讨了为什么会产生这样的算法,在什么样的场景下,哪种算法是最优解,以及这些算法之间是如何相互关联、相互启发的。我特别喜欢它对“分治”和“动态规划”这两种强大思想的阐述,它通过一系列精心设计的例子,将这些抽象的概念具象化,让我不再畏惧它们。读这本书的时候,我常常会有种“原来是这样!”的顿悟感。它不仅仅是教授知识,更是在培养一种解决问题的思维模式,一种用算法的眼光去审视和解决现实问题的能力。对于我这种有一定基础,但总感觉在算法层面“原地踏步”的人来说,这本书无疑是及时雨,它为我打开了一扇新的大门,让我看到了算法更广阔的天地。
这本书真是我近期读到的最让人醍醐灌顶的一本了!尤其是在我纠结于某个经典的排序算法实现细节的时候,翻开它,那种豁然开朗的感觉,简直无与伦比。它不像那些只讲理论的书,枯燥乏味,让你抓不住重点。这本书的厉害之处在于,它把抽象的概念用非常形象的比喻和清晰的图示展现出来。我记得有一章讲到图论的遍历,作者居然用了“寻宝地图”来比喻DFS和BFS,一下子就把我拉近了算法的世界。而且,它提供的伪代码和一些关键的复杂度分析,都写得特别到位,不会让你觉得云里雾里。阅读体验上,它有一种循序渐进的引导感,你读完一章,会自然而然地想去了解下一章的内容,而不是感到负担。这本书对于我来说,不仅仅是一本技术参考书,更像是一位耐心细致的老师,指导我一步步解开算法的奥秘。我本来对某些算法的理解停留在“会用”的层面,但读完这本书,我开始能够“理解”它为什么是这样工作,甚至能自己推导出一些变种。这种从“知道”到“理解”的飞跃,是很多其他书籍无法给予的。
从学习效率的角度来说,这本书的设计是相当人性化的。作者深知读者在学习过程中的可能遇到的难点,所以在很多地方都做了细致的提示和讲解。比如,在介绍复杂度分析时,它并没有直接抛出各种符号,而是先从一个简单的计数开始,逐步引导读者理解O(n)、O(n log n)这些符号的含义。而且,书中提供的练习题质量非常高,它们既能帮助巩固课堂上的知识,又能挑战读者思考更深层次的问题。我特别享受解题的过程,有时候一道题卡住了,但通过反复阅读书中的讲解,再结合自己的思考,最终找到答案时,那种成就感是无与伦比的。这本书的排版也很舒服,代码和文字的比例恰到好处,图示清晰易懂,不会让人产生阅读疲劳。总体而言,这本书的学习曲线设计得很平滑,让我在不知不觉中就掌握了越来越多的算法知识。
说实话,我在阅读这本书的过程中,多次体会到了“顿悟”的乐趣。特别是当我遇到那些一直困扰我的算法概念时,比如递归的本质,或者某些动态规划问题的状态转移方程是如何推导出来的,这本书总能给出一个让我豁然开朗的解释。作者的叙述方式非常有感染力,他仿佛是一位经验丰富的向导,带领我穿越算法的迷宫,每一步都显得那么自然而然。我喜欢它不仅仅是讲解“是什么”,更强调“为什么”和“怎么用”。这种深度挖掘的讲解方式,让我对算法的理解不再停留在表面。而且,这本书并没有回避一些难点,而是勇敢地去面对它们,并通过巧妙的讲解,化繁为简。我感觉自己不仅仅是在学习算法,更是在培养一种严谨的逻辑思维能力,一种解决复杂问题的能力。这本书绝对是我在算法学习道路上的一盏明灯。
滨江图书馆
此书中的程序用C++和Java伪代码编写
此书中的程序用C++和Java伪代码编写
排版以及伪码都不错
内容中规中矩,分治、DP、贪心、回溯、排序、查找。