前言
计算机是如何解决问题的?你的小GPS怎么能在无数可能的路线中找到最快的到达目的地的路线,而且只需要几秒钟?当你在网上购物时,如何保护你的信用卡号码不被人截获? 这些问题的答案,以及其他许多问题的答案,就是算法。我写这本书是为了为你解开算法的奥秘。我与人合著了教科书《算法导论》。这是一本神奇的书(当然,我是有偏见的),但它在某些方面相当专业。这本书不是算法导论。甚至都不是教科书。它既不广泛也不深入计算机算法领域,它没有规定地教授设计计算机算法的技术,它包含为读者解决一个问题或练习。那么这本书到底是什么呢? 这是一个你可以开始的地方,如果
- 你对计算机如何解决问题感兴趣。
- 你想知道如何评估这些解决方案的质量。
- 你想知道计算中的问题和解决问题的方法是如何与非计算机世界相联系的。
- 你可以处理一些数学问题,而且你没有必要编写过计算机程序(尽管编写过程序也无妨)。
一些关于计算机算法的书是概念性的,很少有技术细节。有些书充满了技术上的精确性。有些介于两者之间。每一种类型的书都有自己的位置。我会把这本书放在中间类别。是的,它有一些数学,而且在某些地方变得相当精确,但我避免深入讨论细节(除了可能在书的最后,我无法控制自己)。 我觉得这本书有点像一道开胃菜。假设你去一家意大利餐馆点了一份开胃菜,吃完再决定是否点剩下的菜。它来了,你吃了它。也许你不喜欢开胃菜,决定不点别的。也许你喜欢它,但是它让你觉得很饱,所以你不需要点其他东西。也许你喜欢开胃菜,但它并没有填饱你的肚子,你期待着这顿饭剩下的部分。把这本书当作开胃菜,我希望能得到后两种结果中的一种: 要么你读了这本书,感到满意,觉得没必要再深入研究算法的世界; 或者你非常喜欢你在这里读到的东西,想要了解更多。每一章的结尾都有一个标题为“进一步阅读”的章节,它将引导你阅读深入主题的书籍和文章。
你能从这本书中学到什么?
我不能告诉你你将从这本书中学到什么。以下是我想让你从这本书中学到的东西:
- 计算机算法是什么,描述它们的一种方式,以及如何评估它们。
- 在计算机中搜索信息的简单方法。
- 在计算机中重新排列信息,使其按规定顺序排列的方法。(我们称这个任务为排序)
- 如何解决基本问题,我们可以在计算机中建模的数学结构称为图。在许多应用中,图的建模公路网络(其他路口十字路口有直接的道路,这些道路和多久?),任务之间的依赖关系(任务必须先于其他任务?),财务关系(所有世界货币之间的汇率是什么?),或人们之间的交互(谁知道谁?谁恨谁?哪个演员和哪个演员演了一部电影?)
- 如何解决关于文本字符字符串的问题。其中一些问题在生物学等领域有应用,其中字符代表碱基分子,字符串代表DNA结构。密码学背后的基本原理。即使你自己从未加密过信息,你的电脑也可能加密过(比如你在网上购物时)。数据压缩的基本思想,远远超出了“f u cn rd th u cn gt a gd jb n gd pay”。
- 有些问题很难在合理的时间内用电脑解决,或者至少没有人知道如何解决。
目录
- What Are Algorithms and Why Should You Care?(什么是算法?你为什么要关心它?)
- How to Describe and Evaluate Computer Algorithms(如何描述和评估计算机算法?)
- Algorithms for Sorting and Searching(排序和搜索算法)
- A Lower Bound for Sorting and How to Beat It(排序的下界以及如何超越它)
- Directed Acyclic Graphs(有向无环图)
- Shortest Paths(最短路径)
- Algorithms on Strings(字符串算法)
- Foundations of Cryptography(密码学基础)
- Data Compression(数据压缩)
- Hard? Problems(难?问题)