这是一本算法书?

其实算法书都比较容易写成专门讲算法的书,书中会有很多的伪代码,同时会分析算法的时间,空间复杂度,同时可能会有问题的复杂度之类,大 O 标记法之类的,这个其实是科班出身的学习算法的必经之路。但是书一旦写成这样,也就是教科书了,教科书,可读性就会差很多了。不过这本书不一样,虽然名字叫做《算法之美》,但是实际上讲的是算法在生活中的应用。算法,说白了,也就是解决问题的一种步骤和方法,一旦听到算法这个词就想到计算机科学,实际上是不对的。其实算法存在生活的种种方面,包括日常生活中的一些决策等,实际上都能用到。

说到书名的翻译,叫做《算法之美》,其实说到什么“之美”,本来还是挺抗拒的。之前吴军有一本书叫做《数学之美》,实话讲,我觉得写得比较一般,而且完全没有体现到“美”的这个阶段。使用数学来解决相关的专业问题,重点实际上在建模上,而一旦涉及到建模,实际上就和“美”相去甚远了,那本书实际上应该叫做《数学之复杂问题应用》,是讲如何利用数学公式将一些看起来复杂的问题建模以及应用的。在我看来,通过简单的知识解释一些生活中的各种现象能够叫做“美”,例如一些生活中司空见惯的问题的背后解释。从这个角度看来,这本书叫做“之美”也没有太大问题。

书的内容究竟是什么

这本书从决策,排序,探索与利用,随机,网络,博弈等方向对生活中的各种现象进行了以计算机科学视角如何去看待他,同时其实也给出了很多对于生活来说有意义的经验。下面仅仅摘录几个有意思的结论。

最优停止理论

这个理论实际上对于生活中一些需要在某些特定的时机如何执行相应的行动的问题。其核心观点是说在很多情况下,面对只有一次机会的事件,如果确定了结束的标准,那么达到结束指标 37% 之后来停止就是理论上最优的。例如如果确定在 100 天内招人,那么前 37 天之后,发现的比前面任何一个都优秀的人就可以直接录取了,直接录取到最优秀的人的概率也是 37%。反过来这个例子也说明,即使付出了最大的努力,其实也有 60% 的可能会得不到好的结果。这其实为我们努力过后得到不好的结果提供了一个心理安慰吧。

探索与利用

何时该探索,何时该对探索的结果加以利用?把这个问题再接地气有点,例如,明天中午吃什么?是吃之前吃过认为还不错的那家餐厅,还是说去找一个新餐厅?找新餐厅就是探索,而去之前觉得还不错的餐厅,实际上就是对之前探索结果的一种利用。生活是什么,实际上就是各种平衡,也包括探索和利用的平衡。有趣的是,理论能够证明,如果有机会对探索结果加以利用,那么我们总是应该进行探索。这实际上也是对永远保持好奇心的生活方式的一种注解。但是探索的价值另一方面实际上也包含了之后对其利用的价值,如果没有机会加以利用,那么肯定用不上探索了。比如,如果明天就要搬家,那么还是保险起见,我们今天就去之前好吃的那个店吃饭吧。

排序

排序实际上是很早接触的概念了,不过生活中处处都是排序也是很常见的。就比如打麻将或打扑克,《算法导论》这本书在介绍插入排序时候,直接给出了一个打扑克的排序过程图,每拿起一张新的牌,我们会将其插入到最合适的位置。这个图生动而丰富的描述了插入排序,在以后的生活中,我再也没有忘记这个排序的基本内容,我觉得这才是所谓算法之美的最好注脚。当然排序有一个问题点,就是规模越大越困难,而生活中很多其它事务,是随着批量会简化的,例如大规模制造等。另一方面,排序在很多时候面临很多约束,例如体育比赛的排序,并不能仅仅根据理论计算来进行排序,而是会根据相关情况进行取舍,最佳的例子就是世界杯了。

缓存与局部性定理

缓存有个经典的性质,并不是越大越好,实际上缓存的高效率正是因为其容量的小,越小越容易查询,一旦大了之后,就会出现“缓存的缓存”这样的怪异事情。局部性原理从另一个方面说明了,现在访问的资料有极大的可能接下来也会用到,所以如果桌子上有一堆文件,最好的组织方式并不是建立排序规则,在每次使用过之后进行排序,而是简单的,每次使用之后,将文件就放在最靠近手边的位置,也就是所有资料的最上方,因为接下来很可能还会用到。对于那些一段时间没用到的,实际上可能永远也用不上了。

时间调度理论

其实很简单,就是最重要的事情最先做,在自我管理里面其实也有这种说法,事情分为重要,紧急,重要,不紧急,不重要,紧急,和不重要不紧急几类,只要管理好重要不紧急的事情,就不会演变成重要紧急,从而让人一直去救火。一个重要的策略就是进行“中断联合”,因为在做事情的时候,人和机器一样,频繁的切换都是会消耗资源的,因此,将需要中断处理的事情联合起来一起处理了,能提高不少效率。例如一个人有多个信用卡,完全可以给自己规定一个时间,这天将所有信用卡帐单一起处理了,这样也不会焦虑,也不会错过。实际上,就是不要被外界干扰,具有良好的自律。

贝叶斯理论

贝叶斯理论实际上是现代计算机概率决策的基石,凡是基于概率的决策框架都离不开贝叶斯理论。实际上他提供了一个框架,就是在新知识加入时候,如何更新旧知识,说白了,其实就是学习。随着知识的增加,贝叶斯的估计会越来越靠谱,越来越趋向于事情的真相。如果对于一个知识我们毫无经验,实际上就是瞎猜。而如果觉得瞎猜比较荒谬,实际上是因为我们有了对于事情的更多的认识,而又无法将这个认识放在这个猜测中产生的。

其他

其他书中还给出了关于数据过度拟合,面对过度约束时候的松弛解决问题等等。以及在很多时候利用随机性来解决问题等等。最后讨论人与人的关系,就是博弈了,提出如果博弈的均衡会导入到一个不好的解决,其实很多时候是游戏规则设置的问题。

这个书能有什么启发?

其实很简单,在很多事情上,我们完全可以使用算法的原理来管理我们的生活。很多结论,如果不通过算法方式的思考,可能会觉得无法来解决,实际上通过算法这套方法论,至少可以对思考提出一个方向。另一个方面,算法并不是冷冰冰的和程序相关,实际上就是解决问题的方法,完全可以使用在生活中的。在生活中使用算法思路的有益效果至少为:

即使是最好的策略有时也会产生不好的结果,这就是计算机科学家要小心区分的“过程”和“结果”的原因。“如果你遵循了最好的流程,那么你就已经尽了最大的努力,如果结果不顺心,你也不应该责备自己”。