最近,我参加了CSDN举办的“从高考到程序员”征文活动,获赠了一本图书。在众多图书中,我选了《算法神探》,觉得这本书从名字上来看就比较有意思。拿到书之后,我分两次就把它读完了,可以毫不夸张地说,这是一本让你可以一口气就读完的计算机科普类图书。
首先说一下这本书的大致情况。本书是Google首席工程师Jeremy Kubica的作品(当然,这个人我也没听说过),翻译者是啊哈磊和李嘉浩。对于啊哈磊这个人,IT行业的人或许听说过,他写过一本书叫《啊哈!算法》,读者挺多的。《算法神探》这本书一共二百多页,29个章节,几乎每章都涉及到一种算法或数据结构。在跌宕起伏的故事情节中,我们可以领略到算法之美。
本书的故事情节大概是这样的:一个王国的警局总部遭遇了一起盗窃案,警长请一位被解雇的前探员Frank Runtime来将这个案子调查清楚;之所以要请一位被解雇的探员,是因为他是一位老练的私家侦探,并且非常擅长搜索;Frank Runtime利用他的搜索算法搜查走私的船、跟踪间谍、逃离监狱、开锁,并在最后揭发了一桩暗藏在深处的阴谋。这本书的每一章都是一个故事片段,同时会引入一个新的算法概念。为了加深大家对算法基础知识的了解,在每章的结尾处都会回顾并详细描述本章内出现的算法知识。
按照章节顺序,在本书中出现的算法或数据结构包括:穷举搜索、数组、字符串、二分搜索、广度优先搜索、深度优先搜索、栈、队列、并行算法、迭代加深、逆向索引、二叉搜索树、trie树、最佳优先搜索、优先队列、启发式搜索、堆。下面是对这些概念的简单解释:
穷举搜索:在整个搜索空间内尝试每一种可能性。
数组:一个数组就像一排箱子一样,每个箱子可以存储一条信息。
字符串:由一系列字符组成,这些字符可以是字母、数字、符号或空格。
二分搜索:其工作原理是不断地将搜索空间分成两半,并且把搜索空间限制在其中的一半中。
广度优先搜索:是一个按顺序依次尝试可能的搜索选项的算法,它每次都会选择尝试首先发现的但还没有尝试过的选项。
深度优先搜索:优先考虑最近新遇到的搜索状态,它会沿着一条路往下走,直到遇到目标状态,或者是一条死路。
栈:是一个后入先出的数据结构。
队列:是一个先入先出的数据结构。
并行算法:将一个问题分成数个小块,并同时在这些小块上执行计算,最后再将结果组合起来。
迭代加深:是深度优先搜索的一种改版,它限制了每一次搜索的深度,在第k轮搜索的时候,这个算法会执行一次深度限制为k的深度优先搜索。
逆向索引:它和书的索引类似,对于每一个值,逆向索引可以告诉你这个值在数据中的哪些地方出现过。
二叉搜索树:它是一种数据结构,它存储信息的方式和二叉搜索中使用信息的方式类似,树中的每一个节点存放一个值,并且每个节点最多有两个子节点,左子节点中存放的值都比当前节点中的值小,右子节点中存放的值都比当前节点中的值大。
trie树:是基于树的数据结构,用户可以很方便地通过某个字符串的前缀来搜索到目标字符串。
最佳优先搜索:是基于某种估值分数或者评价函数来选择接下来探索哪个状态的算法。
优先队列:它让你能插入数据,然后按特定的顺序删除数据。
启发式搜索:依据经验来帮助算法快速达到目标。
堆:是基于二叉搜索树的数据结构,它的每个节点与其子节点之间需要时刻维持有序关系;具体而言,对于最大堆,树中的任意一个节点的值都要大于(或等于)其下面的所有节点。
看完了这本书,我的体会有这几个:
第一,一本好的书就是要让其内容具备趣味性,让读者能够有继续读下去直到读完(甚至读好几遍)的理由。
第二,算法不光只是存在于计算机科学的研究和实践中,在我们的生活中,算法也是无处不在的。大到做一个人生中的重要决定,小到买菜购物,背后的指导思想都是算法。
第三,解决一个问题的方法往往不止一种,我们要根据实际情况选择合适的方法,但这个方法可能不是最优的。
《算法神探》,一本具备趣味性和知识性的计算机科普读物,推荐给大家阅读!
欢迎大家扫码加入我的小蜜圈: