读书笔记(V) 编程珠玑

来源:互联网 发布:qq群推广淘宝客链接 编辑:程序博客网 时间:2024/05/18 14:42

 

图片

 

  





 编程珠玑是著名的算法手册,两本书都很薄,但真正做到了字字珠玑,以前买书就像买白菜一样求大而全,读完了之后,却味同嚼蜡,收获甚少。这两本书慕名买了很久,却没有去细读它,最近项目结束,有了闲暇,读了几篇,立刻让我如同发现了新大陆,因为上次做项目用到的一些优化技巧,这本书几乎都涉及到了,就在一句话的简短描述中。
说实话,除了编程珠玑外,我还忽略了一部书,也就是高德纳的计算机程序设计艺术,至少是在以前我大大的低估了这本书。后来随着知识面的增加,才发现计算机程序设计艺术的独到之处,里面涵盖的数据结构和内容编排都非常的独到,总有意外的发现,例如动态内存分配、倒排索引(反文件)、布隆滤波器等。
高德纳的研究的算法都比较纯粹,难怪当年老师慨叹像高德纳能够这么纯粹的研究算法的时代少有了。相比于高德纳,Bentley比较务实一些,在讲解算法时更加的务实,更像一个工程师在求解实际问题,不仅考虑算法的时空开销而且还要考虑计算机体系结构的影响。让我们这些工程向的人看起来更受用。
这里简单的提一提,算法设计在工程和学术的不同。举个简单的例子,在字符串匹配上,如果算理论的时空开销的话,单串匹配一定是高老大等设计的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年写好,神啊!
阅读编程珠玑的过程就是不断的验证自己所得的工程经验的过程。做学术有学术的纯粹与优美,搞工程也有工程的务实和智慧,而且这些智慧和经验一点不比学术少,充满着对问题的分析和洞察,舍弃了纯粹和优美,但却换来了高效和清晰,不仅适用于计算机体系结构,而且利于工程的维护和扩展。
0 0