推荐一本很好的算法入门书籍:《算法设计与分析基础》(第 2 版),(美) Anany Levitin 著, 潘彦译。
除了 《 Thinking in Java 》,这是我另外一本读过了三分之二内容还希望不断翻阅的书籍。这本书写得很不错,可以感受到作者是尽力去贴近读者,讲解清晰易懂,涉及比较全面,而且有不少在其它算法书籍中从不曾讲到的东西(比如算法问题求解基础,大量引人思考的谜题)。
总体来说,可读性很强,趣味性强,实用性尚可,在理论性和实用化之间进行了很好的平衡和折衷,有很好的启发作用。如果你希望有一本容易理解的而又具备一定深度的算法入门书籍,那么,本书可算是上佳的首选。
最权威的算法书籍自然是《算法导论》了。通用算法类书籍,我觉得有这两本足矣!貌似还有一本叫做《程序员实用算法》的书籍,只是在书店随便翻了翻,看书名可推知,这本书用作随身算法手册应该很不错。
PS :关于算法的思考
算法究竟是什么?顾名思义,计算之方法。算法就是使用计算的方法来实现问题求解的思路和途径。
硬件提供计算所需的物理资源;而算法,则提供计算所需的思想和技术。硬件和算法,共同构成了计算机的计算能力。软件,不过是硬件与算法的结合所产生的可使用的逻辑实体。
这就涉及三个基本问题:什么是计算? 如何计算? 一切都可计算吗?
什么是计算?
-
通俗意义上的计算,指的就是数学运算,加减乘除、取模以及其它,而大部分计算(包括减、乘、除、取模,无论多么复杂)都可使用加法来实现;
-
计算机现在已经能够处理文本,那么,处理文本的计算技术是怎样的?
-
在接近计算机硬件层面,任何运算都使用位运算来实现;如何用位运算来实现各种运算,毫无疑问,是数学家最擅长的事情。
-
位运算是物理状态的逻辑表征和变化。物理状态可由电子、机械或其它任何可能的物理实体来实现;毫无疑问,这是物理学家最擅长的事情。
-
在人体和其它生物里,计算的物理实体可能是神经元、生物电之类所运载的东西,究竟以什么作为计算单位,至今还是个谜。
-
如何计算 ?
首先,涉及科学计算的部分,自然是与数学和各特定领域(尤其是工程领域)有关,通常可以遵循相关的定理和公式来计算和改进;涉及文本数据处理的计算技术,则是计算机新兴的应用领域;如何计算的问题,大概就是选取计算基本单位(比如加减乘除,数据复制)及其如何组合的问题了(控制流程,顺序或并发)。
并发计算,或者并行计算,必定成为未来的主流。人脑所采用的计算方式,极可能采用了并行方式。假设一平方米空间能放置100块CPU,那么, 100 平方米的空间可放 10000 块CPU , 假设并行计算算法的利用率是 50% , 那么, 也有 5000块的CPU计算能力, 这意味着,现在一年的计算量,可能只需要 365 / 5000 × 24 = 1.752 小时 的工作量。想想,如果采用更好的并行技术,未来的IT世界会是什么样,难以想象。
一切都可计算吗?
显然,至少目前来说,答案是否定的。这是可计算性理论的问题。并且,若将算法机械地应用于日常生活,常常会显得非常笨拙。人类(乃至其它生物)究竟采取了怎样的计算单位和方式,使得人们在思考问题时显得如此的灵巧多变,还是一个非常值得探索的问题。
程序开发者的位置?
跨过物理运算层面和位运算层面,在其基础上实现 1 , 2 的问题求解。并且,关于科学计算部分,主要由研究相关领域的科学家来完成;对于程序开发者来说,所谓的算法,应当主要指文本处理所用到的算法技术。