编程珠玑是一本较为著名的算法手册,虽然书的字数并不多,但真正做到了字字珠玑,以前买书就像买白菜一样求大而全,读完了之后,却味同嚼蜡,收获甚少。这两本书慕名买了很久,却没有去细读它,最近项目结束,有了闲暇,读了几篇,立刻让我如同发现了新大陆,因为上次做项目用到的一些优化技巧,这本书几乎都涉及到了,就在一句话的简短描述中。
这里简单的提一提,算法设计在工程和学术的不同。举个简单的例子,在字符串匹配上,如果算理论的时空开销的话,单串匹配一定是高老大等设计的KMP,如果是多串匹配,一定是AC自动机,两者在最好最坏的情况下均是o(m+n)的复杂度,但是在工程上,我们并不用这两个算法,最常用的是BM和RK以及shift-or等。高德纳的研究思路就是很纯粹,KMP和AC自动机非常的优雅而精致,但在工程上,性能却不理想,甚至大多说的库宁可实现暴力匹配都不用KMP。个人猜想原因是KMP和AC自动机的跳转开销较大不利于计算机执行指令的优化,另外两者的高效依赖于应用场景。再次,两种算法在最好最坏的情形下都是O(m+n),但其实在一些方案,如BM可以在常见的场景下达到O(n/m)的级别,优于串匹配的平均情形下界o(n*log(sigma)m/m),只在病态的数据情形下达到O(m*n),在工程上应用更多(《程序员实用算法》和《柔性字符串匹配》两书甚至都没有介绍KMP算法(前者甚至介绍暴力匹配及其优化版本,并直接讲解AC自动机,后者简单说明一下KMP的思想,并声称实践中KMP比暴力匹配都要慢一倍),而是重点介绍BM系列算法)。插入一句,高德纳说要在第九章介绍字符串匹配,预计2015年写好,神啊!
阅读编程珠玑的过程就是不断的验证自己所得的工程经验的过程。做学术有学术的纯粹与优美,搞工程也有工程的务实和智慧,而且这些智慧和经验一点不比学术少,充满着对问题的分析和洞察,舍弃了纯粹和优美,但却换来了高效和清晰,不仅适用于计算机体系结构,而且利于工程的维护和扩展。