算法基础:Python和C#语言实现原书第2版罗德·斯蒂芬斯计算机科学丛书Python代码示例操作pdf下载pdf下载

算法基础:Python和C#语言实现原书第2版罗德·斯蒂芬斯计算机科学丛书Python代码示例操作百度网盘pdf下载

作者:
简介:本篇主要提供算法基础:Python和C#语言实现原书第2版罗德·斯蒂芬斯计算机科学丛书Python代码示例操作pdf下载
出版社:一键团图书专营店
出版时间:2020-12
pdf下载价格:0.00¥

免费下载


书籍下载


内容介绍

新增Python代码示例,全面涵盖经典算法、问题求解技巧和程序员面试指南
 
 书   名:  算法基础:python和c#语言实现(原书第2版)
 图书定价:  119元
 作 者:  [美]罗德·斯蒂芬斯(Rod Stephens)
 出 版 社:  机械工业出版社
 出版日期:  2021-01-08
 ISBN 号:  9787111671855
 开   本: 16开
 页   数: 421
 版   次: 1-1
[美]罗德·斯蒂芬斯(Rod Stephens) 著:---作者简介---
罗德·斯蒂芬斯(Rod Stephens) 连续15年被评为Microsoft Visual Basic最有价值专家(MVP),长期在ITT Technical Institute教授编程入门课程。他已经撰写了超过30本技术书籍,这些书被翻译成多种语言在世界范围内出版。他还撰写了超过250篇杂志文章,内容涵盖C#、Visual Basic、Delphi和Java等。

---译者简介---
余青松 华东师范大学高级工程师。1990年毕业于华东师范大学并留校任教。编著计算机相关教材30余本,在国内外学术期刊和学术会议上发表科技论文近百篇。

江红 华东师范大学副教授,博士。1994年毕业于复旦大学计算机系。曾荣获上海市教学成果一等奖、华东师范大学教学成果一等奖、华东师范大学优秀任课教师奖等荣誉。
本书第2版进行了全面修订与更新,更加易于学习。书中描述了那些重要且经典的算法,并且说明了不同算法的适用情境。跟随作者的讲解,读者将学会分析既有算法,进而理解算法背后的原理。同时,读者也将学习创建新的算法,以适应未来的新需求。这些有用的算法包括:操作常用数据结构的方法,高级数据结构,网络算法,以及数值算法。此外,书中还包含通用的问题求解技巧。除了描述算法,作者还详细介绍了如何分析算法的性能。书中提供大量练习,读者可以自己探索修改算法的方法,以便将其应用于新的情境。

出版者的话
译者序
前言
作者简介
第1章 算法基础 1
1.1 方法 1
1.2 算法和数据结构 2
1.3 伪代码 2
1.4 算法的特点 4
1.4.1 大O符号 5
1.4.2 常用的运行时间函数 7
1.4.3 运行时间函数的可视化比较 11
1.5 实际考虑 12
1.6 本章小结 13
1.7 练习题 14
第2章 数值算法 16
2.1 数据随机化 16
2.1.1 随机数生成器 16
2.1.2 随机化数组 20
2.1.3 生成非均匀分布 21
2.1.4 随机行走 22
2.2 查找公约数 25
2.2.1 计算公约数 25
2.2.2公约数算法的扩展应用 27
2.3 计算乘幂 28
2.4 处理素数 29
2.4.1 查找素数因子 29
2.4.2 查找素数 31
2.4.3 素性检验 32
2.5 计算数值积分 33
2.5.1 矩形法则 34
2.5.2 梯形法则 34
2.5.3 自适应积分算法 35
2.5.4 蒙特卡罗积分法 37
2.6 方程求解 38
2.7 高斯消元法 40
2.7.1 前向消元 40
2.7.2 后向代换 41
2.7.3 算法实现 42
2.8 最小二乘法拟合 42
2.8.1 线性最小二乘法 43
2.8.2 多项式最小二乘法 44
2.9 本章小结 45
2.10 练习题 46
第3章 链表 48
3.1 基本概念 48
3.2 单向链表 49
3.2.1 遍历链表 49
3.2.2 查找节点 49
3.2.3 使用哨兵 50
3.2.4 在顶部添加节点 51
3.2.5 在尾部添加节点 51
3.2.6 在指定节点后插入节点 52
3.2.7 删除节点 52
3.3 双向链表 53
3.4 有序链表 54
3.5 自组织链表 55
3.5.1 前移方法 56
3.5.2 交换方法 56
3.5.3 计数方法 56
3.5.4 混合方法 56
3.5.5 伪代码 57
3.6 链表算法 57
3.6.1 复制链表 58
3.6.2 插入排序 58
3.6.3 选择排序 60
3.7 多线链表 61
3.8 循环链表 61
3.8.1 标记节点 62
3.8.2 使用哈希表 63
3.8.3 链表回溯 64
3.8.4 链表反转 65
3.8.5 龟兔赛跑算法 66
3.8.6 双向链表中的环路 68
3.9 本章小结 68
3.10 练习题 68
第4章 数组 70
4.1 基本概念 70
4.2 一维数组 72
4.2.1 查找数组元素 72
4.2.2 查找值、最小值和平均值 72
4.2.3 查找中值 73
4.2.4 查找众数 74
4.2.5 插入数组元素 76
4.2.6 删除数组元素 77
4.3 非零数组下界 77
4.3.1 二维数组 78
4.3.2 高维数组 78
4.4 三角形数组 81
4.5 稀疏数组 83
4.5.1 查找行或列 84
4.5.2 获取元素的值 85
4.5.3 设置元素的值 86
4.5.4 删除数组元素 87
4.6 矩阵 89
4.7 本章小结 91
4.8 练习题 91
第5章 堆栈和队列 93
5.1 堆栈 93
5.1.1 链表堆栈 94
5.1.2 数组堆栈 95
5.1.3 双堆栈 96
5.1.4 堆栈算法 97
5.2 队列 101
5.2.1 链表队列 101
5.2.2 数组队列 102
5.2.3 特殊队列 104
5.3 二项堆 105
5.3.1 二项树的定义 105
5.3.2 二项堆的定义 106
5.3.3 合并树 107
5.3.4 合并堆 108
5.3.5 入队操作 111
5.3.6 出队操作 111
5.3.7 运行时间分析 112
5.4 本章小结 113
5.5 练习题 113
第6章 排序 115
6.1 O(N 2)算法 115
6.1.1 数组的插入排序算法 115
6.1.2 数组的选择排序算法 116
6.1.3 冒泡排序算法 117
6.2 O(NlogN)算法 119
6.2.1 堆排序算法 120
6.2.2 快速排序算法 124
6.2.3 合并排序算法 130
6.3 小于O(NlogN)的算法 132
6.3.1 计数排序算法 132
6.3.2 鸽巢排序算法 133
6.3.3 桶排序算法 135
6.4 本章小结 136
6.5 练习题 137
第7章 查找 139
7.1 线性查找算法 139
7.2 二分查找算法 140
7.3 插值查找算法 141
7.4 多数投票算法 142
7.5 本章小结 143
7.6 练习题 144
第8章 哈希表 145
8.1 哈希表的基本概念 145
8.2 链接哈希表 146
8.3 开放寻址哈希表 147
8.3.1 删除数据项 148
8.3.2 线性探测 149
8.3.3 二次探测 150
8.3.4 伪随机探测 151
8.3.5 双重哈希 151
8.3.6 有序哈希 152
8.4 本章小结 154
8.5 练习题 154
第9章 递归 156
9.1 基本算法 156
9.1.1 阶乘 156
9.1.2 斐波那契数 158
9.1.3 棒料切割问题 159
9.1.4 汉诺塔 161
9.2 图形算法 163
9.2.1 科赫曲线 163
9.2.2 希尔伯特曲线 165
9.2.3 谢尔宾斯基曲线 166
9.2.4 垫圈图案 168
9.2.5 天际线问题 168
9.3 回溯算法 172
9.3.1 八皇后问题 173
9.3.2 骑士巡游问题 175
9.4 组合与排列 177
9.4.1 基于循环的组合 178
9.4.2 允许重复项的组合 179
9.4.3 不允许重复项的组合 180
9.4.4 允许重复项的排列 181
9.4.5 不允许重复项的排列 182
9.4.6 轮询调度算法 183
9.5 递归的删除 188
9.5.1 尾部递归的删除 188
9.5.2 动态规划 189
9.5.3 自底向上编程 190
9.5.4 删除递归的通用方法 191
9.6 本章小结 193
9.7 练习题 194
第10章 树 196
10.1 有关树的术语 196
10.2 二叉树的性质 198
10.3 树的表示 200
10.3.1 构建常规树 200
10.3.2 构建完全树 203
10.4 树的遍历 203
10.4.1 前序遍历 204
10.4.2 中序遍历 206
10.4.3 后序遍历 206
10.4.4 广度优先遍历 207
10.4.5 遍历的应用 207
10.4.6 遍历的运行时间分析 208
10.5 有序树 208
10.5.1 添加节点 209
10.5.2 查找节点 210
10.5.3 删除节点 211
10.6 最小共同祖先 212
10.6.1 在有序树中查找最小共同祖先 212
10.6.2 使用指向父节点的指针 213
10.6.3 使用指向父节点的指针和深度字段 214
10.6.4 常规树 214
10.6.5 欧拉环游 216
10.6.6 所有节点对的最小共同祖先 217
10.7 线索树 217
10.7.1 构建线索树 218
10.7.2 线索树的应用 220
10.8 特殊的树算法 221
10.8.1 动物游戏 221
10.8.2 表达式求值 223
10.9 区间树 224
10.9.1 构建区间树 225
10.9.2 与点相交 226
10.9.3 与区间相交 226
10.9.4 四叉树 228
10.9.5 字符串树 231
10.10 本章小结 235
10.11 练习题 235
第11章 平衡树 239
11.1 AVL树 239
11.1.1 添加值 239
11.1.2 删除值 240
11.2 2-3树 241
11.2.1 添加值 242
11.2.2 删除值 242
11.3 B树 244
11.3.1 添加值 245
11.3.2 删除值 245
11.4 平衡树的变种 246
11.4.1 自顶向下的B树 246
11.4.2 B+树 247
11.5 本章小结 248
11.6 练习题 248
第12章 决策树 250
12.1 搜索博弈树 250
12.1.1 极小极大算法 251
12.1.2 初始移动和响应 254
12.1.3 博弈树启发式算法 254
12.2 搜索常规决策树 255
12.2.1 优化问题 256
12.2.2 穷举搜索 257
12.2.3 分支定界搜索 258
12.2.4 决策树启发式算法 259
12.2.5 其他决策树问题 264
12.3 群集智能 267
12.3.1 蚁群优化算法 268
12.3.2 蜂群算法 268
12.3.3 群集仿真 269
12.4 本章小结 270
12.5 练习题 271
第13章 基本网络算法 274
13.1 有关网络的术语 274
13.2 网络的表示 276
13.3 遍历 278
13.3.1 深度优先遍历 278
13.3.2 广度优先遍历 280
13.3.3 连通性测试 281
13.3.4 生成树 282
13.3.5 最小生成树 283
13.3.6 欧几里得最小生成树 284
13.3.7 构建迷宫 284
13.4 强连通组件 285
13.4.1 Kosaraju算法 285
13.4.2 关于Kosaraju算法的讨论 286
13.5 查找路径 288
13.5.1 查找任意路径 288
13.5.2 标签设置最短路径 289
13.5.3 标签修正最短路径 291
13.5.4 所有节点对的最短路径 292
13.6 传递性 295
13.6.1 传递闭包 295
13.6.2 传递归约 296
13.7 最短路径算法的改进 298
13.7.1 形状点 298
13.7.2 提前终止 299
13.7.3 双向搜索 299
13.7.4 最佳优先搜索 299
13.7.5 转弯惩罚和禁行 299
13.8 本章小结 302
13.9 练习题 302
第14章 高级网络算法 304
14.1 拓扑排序 304
14.2 回路检测 306
14.3 地图着色 307
14.3.1 双色地图 307
14.3.2 三色地图 308
14.3.3 四色地图 309
14.3.4 五色地图 309
14.3.5 其他地图着色算法 312
14.4流量 312
14.4.1 工作分配 314
14.4.2 最小流量切割 314
14.5 网络克隆 316
14.5.1 字典 316
14.5.2 克隆引用 317
14.6 节点团 318
14.6.1 暴力破解方法 318
14.6.2 Bron-Kerbosch算法 319
14.6.3 查找三角形节点团 323
14.7 社区检测 324
14.7.1 极大节点团 325
14.7.2 Girvan-Newman算法 325
14.7.3 派系过滤法 326
14.8 欧拉路径和欧拉回路 326
14.8.1 暴力破解方法 327
14.8.2 弗莱里算法 327
14.8.3 Hierholzer算法 327
14.9 本章小结 328
14.10 练习题 329
第15章 字符串算法 331
15.1 匹配括号 331
15.1.1 算术表达式求值 332
15.1.2 构建解析树 332
15.2 模式匹配 333
15.2.1 DFA 333
15.2.2 为正则表达式构建DFA 335
15.2.3 NFA 336
15.3 字符串搜索 337
15.4 计算编辑距离 340
15.5 语音算法 342
15.5.1 Soundex 342
15.5.2 Metaphone 343
15.6 本章小结 344
15.7 练习题 344
第16章 密码学 347
16.1 术语 347
16.2 置换加密算法 348
16.2.1 行/列置换加密算法 348
16.2.2 列置换加密算法 349
16.2.3 路由加密算法 351
16.3 替换加密算法 351
16.3.1 恺撒替换加密算法 351
16.3.2 维吉尼亚加密算法 352
16.3.3 简单替换加密算法 354
16.3.4 一次性便笺加密器 354
16.4 分组加密算法 355
16.4.1 替换-置换网络加密算法 355
16.4.2 菲斯特尔加密算法 356
16.5 公开密钥加密与RSA 357
16.5.1 欧拉函数 358
16.5.2 乘法逆元 358
16.5.3 RSA示例 358
16.5.4 实际考虑 359
16.6 密码学的其他应用场景 359
16.7 本章小结 360
16.8 练习题 360
第17章 计算复杂性理论 362
17.1 标记法 362
17.2 算法复杂性类别 363
17.3 归约 365
17.3.1 3SAT 366
17.3.2 二分图匹配 366
17.4 NP难问题 367
17.5 检测问题、报告问题和优化问题 367
17.5.1 检测问题≤p报告问题 368
17.5.2 报告问题≤p优化问题 368
17.5.3 报告问题≤p检测问题 368
17.5.4 优化问题≤p报告问题 369
17.5.5 近似优化 369
17.6 NP完全问题 369
17.7 本章小结 371
17.8 练习题 372
第18章 分布式算法 374
18.1 并行计算的类型 374
18.1.1 脉动阵列 374
18.1.2 分布式计算 376
18.1.3 多CPU处理 378
18.1.4 竞争条件 378
18.1.5 死锁 381
18.1.6 量子计算 382
18.2 分布式算法 382
18.2.1 调试分布式算法 383
18.2.2 密集并行算法 383
18.2.3 合并排序算法 384
18.2.4 哲学家就餐问题 385
18.2.5 两个将军问题 387
18.2.6 拜占庭将军问题 388
18.2.7 一致性问题 390
18.2.8 领导选举 393
18.2.9 快照技术 393
18.2.10 时钟同步 394
18.3 本章小结 395
18.4 练习题 395
第19章 面试难题 397
19.1 面试官提出面试难题 398
19.2 应聘者回答面试难题 399
19.3 本章小结 402
19.4 练习题 403
附录 练习题参考答案
新增Python代码示例,全面涵盖经典算法、问题求解技巧和程序员面试指南
算法是高效率编程的秘诀。算法用于描述如何排序记录、搜索数据项、计算诸如素数因子之类的数值、寻找街道路网中两点之间的最短路径,以及通过通信网络确定所允许的信息流。好算法和坏算法之间的区别在于:面对同一个问题,使用好算法可能意味着几秒就可以解决问题,而使用坏算法则需要几小时的时间,甚至永远解决不了问题。
研究算法有助于我们建立一个解决特定问题的实用方法工具包,同时可以帮助我们了解在不同的情况下哪些算法更有效,这样我们就可以选择某个特定程序的算法。一个算法可能在一组数据上性能表现优越,但对于其他数据则性能表现糟糕。因此,了解如何选择特定场景的算法十分关键。
更为重要的是,通过研究算法,我们可以学习解决问题的通用技巧并将其应用于其他问题,即使我们了解的所有算法中并不存在任何一个适合当前场景的算法。这些技巧可以让我们以不同的方式看待新问题,这样我们就可以创建属于自己的特定算法来解决问题,同时满足意想不到的需求。
学习和研究算法除了可以帮助我们解决实际工作中遇到的问题外,还可以帮助我们找到称心如意的职位。许多大型科技公司,例如微软、谷歌、雅虎、IBM,都希望程序员能够理解算法,并掌握相关的问题求解技术。在面试时,一些公司还会重点考察求职者的算法编程和解决逻辑问题的能力。
当然,好的面试官并不期望应聘者能够解决所有的难题。事实上,当应聘者没能解决难题的时候,他们可能会更好地了解应聘者。最好的面试官并不是想知道应聘者提供的答案,而是想看看应聘者如何处理一个不熟悉的问题。他们想看看应聘者在面试时是否会就此放弃并提出这个问题不适用于工作面试。或者,应聘者可以分析问题,并提出一个合理的推理路线,使用算法方法来解决问题。“天哪,我不知道。也许我会上网搜索”是一个糟糕的回答,而“似乎递归的分而治之方法可能奏效”是一个不错的回答。
本书是一本易于阅读的计算机算法入门教程,阐述了许多重要的经典算法,并指出不同算法所适用的场景。本书阐述了如何通过分析算法来理解算法的性能,最重要的是,本书将教授用于帮助读者自行创建新算法的技能。
本书描述的一些实用算法包括:
数值算法,例如随机化、因子分解、素数问题、数值积分。
常见数据结构的操作方法,例如数组、链表、树、网络。
高级数据结构的用法,例如堆、平衡树、B树。
排序和查找。
网络算法,例如最短路径、生成树、拓扑排序、流量计算。
本书阐述的通用问题求解技巧包括:
暴力算法或者穷举搜索算法
分而治之法
回溯法
递归法
分支定界法
贪婪算法和爬山算法
成本算法
限制范围
启发式算法
为了帮助读者掌握算法,本书提供了练习题。读者可以借助这些练习题来探索如何修改算法以适用于新的场景。练习也有助于读者掌握算法中的主要技术。
最后,本书还提供了读者在面试中可能遇到的一些算法问题的处理技巧。算法技巧可以帮助读者解决众多面试难题。即使读者不能使用算法技巧来解决每一个难题,也至少证明读者熟悉解决某些问题的方法。
为什么要研究算法
研究算法主要有以下几个原因。首先,算法提供了有用的工具,我们可以使用这些工具来解决特定的问题,例如排序或者查找最短路径。即使我们所采用的程序设计语言中包含直接采用某种算法来处理任务的工具,理解这些工具的工作原理也会有帮助。例如,理解数组和列表排序算法的工作原理,将有助于我们决定在程序中采用哪些适合的数据结构。
其次,算法也教授我们一些方法,以及如何将这些方法应用到其他具有相同数据结构的问题上。算法提供了一系列可以应用于其他问题的技术,如递归、分而治之、蒙特卡罗模拟、链表数据结构、网络遍历等,它们广泛适用于各种各样的问题。
再次,研究算法可以锻炼我们的大脑,这或许是最重要的原因。就像力量训练可以帮助足球运动员或者棒球运动员锻炼肌肉一样,研究算法可以培养我们解决问题的能力。职业运动员在比赛中可能不需要仰卧举重,类似地,程序员可能不需要在项目中实现简单的排序算法。然而,无论是参加体育比赛还是编写程序,多加练习都有助于提高我们的能力。
最后,研究算法具有很强的趣味性,可以使人获得满足感,有时还会令人喜出望外。当我将一堆数据存储到程序中,并渲染出一个真实的三维场景时,结果总是令我惊喜连连。即使经过几十年的研究,当一个特别复杂的算法产生了正确的结果时,我仍然能感受到胜利的喜悦。当所有的程序片段能够完美地结合起来解决一个特别具有挑战性的问题时,我感觉至少世界上有些事情是正确并且值得的。
算法的选择
本书选取的每一种算法都是基于以下一个或者多个原因:
该算法非常有用,经验丰富的程序员应该理解该算法的工作原理,以及如何在程序中正确使用该算法。
该算法展示了重要的算法编程技术,该技术可以应用于其他问题的求解过程。
该算法通常会被计算机科学专业的学生研究,因此该算法或其使用的技术可能会出现在技术面试中。
通过阅读本书并完成章末练习,读者将在算法技术方面打下良好的基础,并学会解决自己面临的程序设计问题。
读者对象
本书主要面向三类读者:专业程序员、正在为工作面试做准备的程序员、学习程序设计的学生。
专业程序员会发现,本书中描述的算法和技术有助于他们解决在工作中遇到的问题。即使读者遇到的问题不能使用本书中的算法直接解决,研究这些算法也会给读者提供全新的视角,从而帮助读者洞察问题,找到新的解决方案。
正在为工作面试做准备的程序员可以使用本书学习算法技巧。读者参加的面试中可能不会包括本书中描述的任何一个具体问题,但有可能包括十分相似的问题,因此读者可以使用在本书中学到的技巧来解决问题。即使不能完整地求解一个问题,但是只要读者能发现某个数据结构与算法中使用的数据结构相似,就可以提出类似的策略,这样也可以得到一定程度的加分。
基于前面阐述的原因,所有学习程序设计的学生都应该学习算法。本书阐述的基本都是简单、优雅和强大的算法,但这些算法并不都是十分常见的,所以读者自己并不一定会有什么偶然的机会去发现这些算法。递归法、分而治之法、分支定界法,以及如何使用众所周知的数据结构,对于任何对程序设计感兴趣的人而言都是不可或缺的知识。
注意:就我个人而言,我研究算法纯粹是为了享受!算法对我而言就等同于填字游戏或者数独游戏。我非常享受成功实现一个复杂的算法并观察其运行结果所带来的成就感!
在聚会上,算法也是不错的开场白:“对于标签设置和标签修正最短路径算法,请问您有何高见呢?”
如何充分利用本书
读者可以通过阅读本书来了解一些新的算法和技术,但是要想真正掌握这些算法,则需要切实使用它们。读者需要使用某种程序设计语言来实现算法。同时,还需要对算法进行试验和修正,并在旧问题上尝试算法的新变体。关于如何使用本书中的算法,本书中的练习题和面试问题可以为读者提供一些新方法。
为了充分利用本书,强烈建议读者使用最喜欢的程序设计语言实现尽可能多的算法,甚至采用多种程序设计语言实现算法,以了解不同程序设计语言对算法运行结果的影响。读者应该完成本书中的练习题,至少需要撰写解决练习题的纲要。最理想的情况是使用某种程序设计语言实现这些算法。书中的每一道练习题都有其被选中的原因,在仔细研究这些问题之前,读者可能不会意识到这一点。这些练习题可能会引导读者走上正确之路,路上趣味无穷,但限于篇幅,本书无法展开阐述。
最后,建议读者查阅一些互联网上的面试题,并尝试解决这些问题。在很多面试中,面试者并不需要真正给出解决方案,但是至少应该提出解题思路。当然,如果读者有足够的时间来给出解决方案,将会有更大的收获。
学习算法是一项需要实际动手操作的实践活动。读者应该勇于放下书本,使用编译器编写一些实际的代码!
本书网站
本书有两个网站:Wiley出版社的官网和作者本人的网站。这两个网站都包含本书的源代码。
本书Wiley出版社的官网地址为www.wiley.com/go/essentialalgorithms2e。读者也可以访问www.wiley.com,然后按书名或者书号(ISBN 978-1-119-57599-3)搜索本书并获取所有源代码。
C#程序采用帕斯卡命名法的大小写命名约定。例如,第9章练习题4中展示汉诺塔问题图形解决方案的程序名为GraphicalTowerOfHanoi。与之对应的Python程序则使用下划线小写命名规范,其对应的程序名为graphical_tower_of_hanoi.py。
本书作者的网站地址为http://www.CSharpHelper.com/algorithms2e.html。
本书的组织结构
以下简要介绍本书的内容。
第1章阐述了分析算法时必须理解的基础概念,讨论了算法和数据结构之间的区别,引入了大O符号,并描述了各种实际考虑比理论运行时间计算更重要的情形。
第2章阐述了处理数值的几种算法,这些算法用于随机化数值和数组、计算公约数和最小公倍数、执行快速指数运算、判断一个数值是否是素数等。其中一些算法还涉及有关自适应数值积分算法和蒙特卡罗模拟的重要技术。
第3章阐述了链表数据结构,这些灵活的结构可以用来存储结构随时间增长、收缩和变化的列表。这些基本概念对于构建其他链接数据结构(例如树和网络)也很重要。
第4章阐述了特殊的数组算法和数据结构,例如三角矩阵和稀疏数组,它们可以节省程序时间和内存。
第5章阐述了让程序以先进先出(FIFO)或者后进先出(LIFO)的顺序存储和检索数据项的算法与数据结构。这些数据结构在其他算法中很有用,可以用于模拟真实场景,例如商店的结账队列。
第6章阐述了排序算法,展示了各种实用的算法技术。不同的排序算法适用于不同类型的数据,并且具有不同的理论运行时间,所以理解这些排序算法非常有好处。这些算法也是已知的具有精确理论性能边界的算法,因此特别值得研究。
第7章阐述了可以用来对排序列表进行搜索的算法,演示了二分查找算法和插值查找算法等重要技术。
第8章阐述了哈希表的数据结构。哈希表数据结构使用额外的内存,使程序能够非常快速地定位特定的数据项。哈希表充分展示了在许多项目中非常重要的时间和空间权衡策略。
第9章阐述递归算法,即自己调用自己的算法。有些问题具有自然递归属性,因此递归技术可以简化问题的求解。不幸的是,递归有时会导致问题,因此本章还描述了在必要时如何避免使用递归。
第10章阐述了高度递归的树数据结构,这些结构对于存储、操作和研究分层数据非常有用。树还可以在特殊场景中使用,例如求解算术表达式。
第11章阐述了随着时间的推移如何保持树的平衡性。通常,树结构会变得又高又细,这会破坏树算法的性能。平衡树通过确保树不会增长得太高和太细来解决这个问题。
第12章阐述试图解决可建模为一系列决策问题的算法。这些算法经常用于求解非常困难的问题,所以往往只给出近似解而非解。然而,这些算法具有很大的灵活性,因而可以被应用于各种各样的问题。
第13章阐述了基本网络算法,例如访问网络中的所有节点、检测网络中的回路、创建生成树和通过网络查找路径。
第14章阐述了高级网络算法,例如用于安排相关任务的拓扑排序、图着色、网络克隆、为员工分配工作等。
第15章阐述了操作字符串的算法,其中一些算法(例如搜索子字符串)内置于大多数程序设计语言中,不需要定制编程就可以直接使用。其他算法(例如括号匹配和查找字符串之间的差异)则需要一些额外的工作,同时也涉及一些有用的技术。
第16章阐述了如何对信息进行加密和解密,涵盖加密的基础知识,并描述了几种有趣的加密技术,例如维吉尼亚加密算法、分组加密算法和公开密钥加密算法。本章不涉及现代加密算法的所有细节,例如数据加密标准(DES)和高级加密标准(AES),因为这些加密算法更适合在专门讨论加密的书籍中阐述。
第17章阐述了计算机科学中最重要的两类问题:P问题(可以在确定的多项式时间内解决的问题)和NP问题(可以在不确定的多项式时间内解决的问题)。本章描述了这两类计算复杂性问题,并给出了验证一个问题属于P问题还是NP问题的方法,以及计算机科学中最深刻的问题—P问题是否等价于NP问题。
第18章阐述了在多个处理器上运行的算法。几乎所有的现代计算机都包含多个处理器,而且未来的计算机将包含更多的处理器,因此这些算法对于充分发挥计算机的潜能是不可或缺的。
第19章阐述了一些技巧和技术,可以用于攻克程序员面试过程中所遇到的难题。本章还包括一个网站列表,其中包含大量的面试题,读者可以用来练习。
附录包含各章末尾练习题的参考答案。
此外,为了帮助读者从书中获取更多的知识,并更好地理解书中的内容,本书设计了以下几种模块。
精彩的附加资料
包含额外的信息和主题。
警告:包含与上下文直接相关的信息,提醒读者必须牢记。
注意:包含与当前讨论内容相关的注解、技巧和提示等。
阅读本书的准备工作
为了阅读本书并理解算法,读者不需要任何特殊装备,只是可能需要眼镜和咖啡。然而,如果读者希望真正掌握本书的内容,则需要在实际的程序设计语言环境中实现尽可能多的算法。读者选择使用哪种程序设计语言并不重要。无论使用哪种程序设计语言实现算法细节,都将帮助读者更好地理解算法,以及掌握使用该特定语言所需的特定处理方法。
当然,如果读者打算使用某种程序设计语言实现算法,则需要一台计算机和相应的开发环境。
本书配套网站中包含一些示例代码,读者可以下载源代码,并使用Visual Studio 2017执行C#代码,或者使用Python 3.7执行Python代码。如果读者想运行这些程序,则需要在计算机上安装C# 2017或者Python 3.7,然后就可以正常运行这些程序了。
运行任何版本的Visual Studio都需要有一台速度较快的现代化计算机,并且配有大容量的硬盘和内存。例如,500GB的硬盘对我来说绰绰有余,况且硬盘的价格相对而言比较便宜,建议读者为自己的计算机购买并配置大一点的硬盘。
当然,读者可以在配置较低的系统上运行Visual Studio。但是,使用低配的计算机可能会使运行速度非常缓慢,其体验会令人沮丧。Visual Studio需要占用较多的内存,所以如果读者的计算机性能存在问题,可以考虑扩展内存容量。
使用免费的Visual Studio Community Edition可以运行本书提供的C#程序,因此不需要安装其他昂贵的Visual Studio版本。读者可以通过以下网址获取更多的信息并免费下载Visual Studio:http://visualstudio.microsoft.com/downloads。
读者可以通过以下网址下载Python:http://www.python.org/downloads/。Python 3.7或者更高版本应该能够运行本书的Python示例程序。除了在本地系统上安装Python外,还可以在云中运行。例如,Google Colaboratory(http://colab.research.google.com)是一个免费的环境,该云环境允许用户在任何Android设备上运行Python程序。
本书构建示例程序的系统环境是Windows 10,因此如果读者在其他平台(例如Linux、OS X或者云)上运行Python,可能会存在一些差异。遗憾的是,如果读者在其他平台环境中遇到问题,我就爱莫能助了,只能靠读者自己来解决问题。
算法的运行性能也取决于用于运行示例程序的环境和设备的速度。如果读者不确定某个程序的性能,可以从尝试小规模问题开始;理解了程序的行为后,再去尝试大规模问题。例如,在尝试解决一个包含100个数据项的划分问题(在世界末日来临之前,可能无法运行完成)之前,请先尝试彻底解决一个包含10个数据项的划分问题(这个问题应该运行得很快)。
作者的联系方式
如果读者有任何问题、意见或者建议,欢迎随时发送电子邮件至RodStephens@csharp-helper.com。我无法保证解决读者所有的算法问题,但会尽力给读者指明解决问题的正确方向。
致谢
感谢Ken Brown、Devon Lewis、Gary Schwartz、Pete Gaughan、Jim Minatel、Athiyappan Lalitkumar,以及Wiley出版社的相关人员,是他们的大力帮助使本书得以顺利出版。
感谢多年的朋友John Mueller,作为技术编辑,他的工作使得本书中的信息更加准确。(书中存在的任何错误全部由我负责,与他无关。)
同时,也感谢Sunil Kumar对本书第1版提出了宝贵的反馈意见。
 

^_^:b50d69e2c56959c0a7d975c7f053d1a3