《算法基础:打开算法之门》一导读

简介: 计算机是如何解决问题的呢?小小的GPS是如何只在几秒钟内就从无数条可能路径中找出到达目的地的最快捷路径的呢?在网上购物时,又如何防止他人窃取你的信用卡账号呢?解决这些问题,以及大量其他问题的答案均是算法。我写本书的目的就是为你打开算法之门,解开算法之谜。


7029e82369bcde784bf1662d276c815796eeb95d

前言

Algorithms Unlocked
计算机是如何解决问题的呢?小小的GPS是如何只在几秒钟内就从无数条可能路径中找出到达目的地的最快捷路径的呢?在网上购物时,又如何防止他人窃取你的信用卡账号呢?解决这些问题,以及大量其他问题的答案均是算法。我写本书的目的就是为你打开算法之门,解开算法之谜。
我是《算法导论》的合著者之一。《算法导论》是一本特别好的书(当然,这是我个人的主观评价),但是它确实相当专业。
本书并不是《算法导论》,甚至不能被称为一本教材。它既没有对计算机算法领域进行广度或深度的研究,也没有遵照惯例来讲述设计计算机算法的方法,甚至连一道需要读者自己求解的难题或者练习题也没有。
那么,这是一本什么样的书呢?如果你符合如下条件,那么就可以开始阅读之旅了:
●你对计算机如何解决问题感兴趣;
●你想知道如何评估这些解决方案的质量;
●你想了解计算方面的问题和这些问题的解决方案是如何与非计算机世界关联起来的;
●你能处理一点数学运算;
●你不需要编写过计算机程序(当然,编写过程序更好)。
一些计算机算法方面的书籍是讲述理论概念的,并涉及非常少的技术细节;一些书籍关注的全是技术细节;而另外一些书籍是介于这两者之间的。每类图书都有自己的定位,我将本书定位于介于两者之间。诚然,本书涉及了一些数学知识,并且部分地方阐述得非常仔细,但是我已经竭力避免深入阐述细节(或许除了本书的末尾部分,我无法克制住自己,阐述了一些细节知识)。
我认为本书有点像开胃菜。设想你去了一家意大利餐厅,点了一份开胃菜,直到吃完开胃菜,你才会决定是否点其余食物。开胃菜到了,你就开始用餐了。或许你不喜欢吃开胃菜,并且决定不点其他菜了。可能你喜欢吃开胃菜,但是吃完它,你就感觉饱了,因此不需要点其他菜了。或者也有可能你喜欢吃开胃菜,但你并没有吃饱,此时你便开始期待其他菜了。将本书看作开胃菜,我希望能够产生后两种结果之一:或者读完了本书,你就很满足,感觉没有必要再深入探究算法世界了;或者你非常喜欢从本书中所学到的知识,以至于你想要学习更多算法方面的内容。每一章最后一节的标题为“拓展阅读”,其中会介绍更多关于该章主题的更为深入的书籍和文章。
你将从本书中学到什么
我无法断定你将从本书中学到什么。如下是我希望你能从本书中学到的:
●什么是计算机算法,能够采用一种方式来描述计算机算法,以及如何评估算法。
●在计算机中查找信息的简单方式。
●在计算机中重排信息以使其以一种预定顺序排列的方法。(我们称这一任务为“排序”。)
●如何解决那些能在计算机中以一种称为“图”的数学结构建模的基本难题。在许多应用中,利用图建模的领域包括:道路网(哪些十字路口到哪些十字路口有直接相连的道路,这些道路有多长),任务间的依赖关系(哪个任务必须在其他任务之前完成),金融关系(世界各国货币间的汇率是多少),或者是人与人之间的联系(谁认识谁?谁讨厌谁?哪个演员和哪个演员出现在同一个电影中等)。
●如何解决关于文本字符串的问题。其中一些问题在某些领域有所应用,例如生物学领域,其中字符表示基本的分子,字符串表示DNA结构。
●密码学背后的基本原理。即使你自己从来没有加密过一条信息,你的计算机很可能已经对它执行加密操作了(例如当你在网上购物时)。
●数据压缩的基本概念,这远远超过了“f u cn rd ths u cn gt a gd jb n gd pay”背后的压缩原理。
●计算机在任意合理的时间内都难以解决的一些问题,或者至少还没有人想出如何解决的问题。
为了理解本书中的内容,你需要事先了解什么
正如我之前所说的,本书中涉及部分数学知识。如果你害怕数学,那么你可以尝试着跳过它,或者你也可以尝试着阅读涉及更少专业技术知识的书籍。但是我已经尽力做到令数学部分变得容易理解了。
我假定你从来没有写过,甚至从来没有读过一个计算机程序。如果你能看懂提纲的内容,就应该能够理解我是如何表达每一步算法,以及如何将这些步骤合并在一起组合成一个完整的算法的。如果你听到过如下笑话,那么你已经是在通往算法世界了:
你听说过被困在淋浴中的计算机专家吗?当时他在按照洗发瓶上的指示洗头发。指示说明是“打洗发露。冲洗。重复。”
本书使用了一种自由的写作风格,希望这种比较个性的方法能使本书的内容看起来更容易理解。有些章节依赖于前面章节的内容,但是这种依赖程度很轻。有些章节开始时不涉及专业技术知识,但是会逐步讲述专业技术知识。即使你感觉某一章太难了,这也不会影响下一章内容的学习。你也很可能会从下一章的开始部分受益。
报告错误
如果你在本书中发现了错误,请通过发送邮件至algorithmsunlocked@mitedu来告知我。

目 录

第1章 什么是算法以及为什么应该关注算法
1.1 正确性
1.2 资源利用
1.3 针对非计算机专业人士的计算机算法
1.4 针对计算机专业人士的计算机算法
1.5 拓展阅读
第2章 如何描述和评估计算机算法
2.1 如何描述计算机算法
2.2 如何描述运行时间
2.3 循环不变式
2.4 递归
2.5 拓展阅读
第3章排序算法和查找算法
3.1 二分查找
3.2 选择排序
3.3 插入排序
3.4 归并排序
3.5 快速排序
3.6 小结
3.7 拓展阅读
第4章排序算法的下界和如何超越下界
41基于排序的规则
42基于比较排序的下界
43使用计数排序超越下界
44基数排序
45拓展阅读
第5章有向无环图
51有向无环图
52拓扑排序
53如何表示有向图
54拓扑排序的运行时间
55PERT图表中的关键路径
56有向无环图中的最短路径
57拓展阅读
第6章最短路径
61Dijkstra算法
62BellmanFord算法
63FloydWarshall算法
64拓展阅读
第7章字符串算法
71最长公共子序列
72字符串转换
73字符串匹配
74拓展阅读
第8章密码学基础
81简单替代密码
82对称密钥加密
83公钥加密
84RSA加密系统
85混合加密系统
86计算随机数
87拓展阅读
第9章数据压缩
91哈夫曼编码
92传真机
93LZW压缩
94拓展阅读
第10章难?问题
101棕卡车问题
102P、NP和NP完全类
103可判定问题和归约

相关文章
|
机器学习/深度学习 人工智能 算法
一文搞懂模型量化算法基础
一文搞懂模型量化算法基础
2673 0
|
算法 API
算法基础学习2——冒泡排序
要比较的每一对元素是相邻的,从下标为0开始,到最后一个元素,如果下标设为 j,则相邻元素下标值为 j +1,搜索到最后一个元素:j+1<a.length,而 a.length - 1 = i ;所以终止条件是 j < i
99 0
算法基础学习2——冒泡排序
|
机器学习/深度学习 算法 Java
算法基础学习1——时间复杂度和空间复杂度
算法基础学习1——时间复杂度和空间复杂度
95 0
算法基础学习1——时间复杂度和空间复杂度
|
搜索推荐 Java
Java基础数组-冒泡排序算法
Java基础数组-冒泡排序算法
Java基础数组-冒泡排序算法
|
机器学习/深度学习 自然语言处理 算法
深度学习算法基础
深度学习算法基础
146 0
|
存储 编解码 算法
【算法基础】希尔排序解析
希尔排序的基本思想是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
86 0
|
编解码 算法 网络协议
【算法基础】冒泡排序解析
在我们数组排序中,每一个数组元素根据大小比对,小的元素不断向前移动,如同气泡在冒出一样,我们称这种排序方法为冒泡排序。
132 0
|
机器学习/深度学习 编解码 算法
【算法基础】归并排序解析
归并排序是建立在归并操作上的一种有效,稳定的排序算法,它是采用分治法的一个非常典型的应用。将待排序数组分为两条线逐级拆分,将子序列进行排序,然后沿两条线逐级合并,得到完全有序序列。这种通过递归,层层合并的方法,称为归并。
129 0
|
存储 算法
算法基础
递归算法在计算机系统中用栈帮助实现,一般常见的算法有深度优先遍历(DFS),可以解决的问题有迷宫问题是否连通的问题,递推会对应一个递归搜索树,递归搜索树可以帮助我们更好的理解递归的流程,递归要注意的有是否可以进行剪枝,在迷宫问题中,也要考虑是否要保存原有的迷宫。
143 0
算法基础
|
算法 C语言
C语言算法基础-在一个单链表中值为y的结点前面插入一个值为x的结点
题目:3.4设计一个算法,在一个单链表中值为y的结点前面插入一个值为x的结点。即使值为x的新结点成为值为y的结点的前驱结点。 题目来自李云清版《数据结构》
237 5
C语言算法基础-在一个单链表中值为y的结点前面插入一个值为x的结点