算法的误解
![](https://img9.doubanio.com/icon/u43793218-26.jpg)
也许关于算法方面的最大的误解,就是没有意识到它是由关系密切而又非常不同的两个部分组成的。
对于一个给定的问题,选择哪一种算法才是最适合的?选定算法之后,在编程环境中又是如何实现这个算法,是使用已有的库还是自己从头开始编写,是用 X 语言还是 Y 语言?这个算法实现和已有的程序结合得如何,需要对它进行修改吗?它的实际运行速度是快是慢?
以上这些,都是算法在实现阶段需要考虑的问题,这些问题主要是和工程相关的,是大部分编程人员日常工作中最常见也是最重要的部分。
另一方面,设计一种崭新的算法,或者改进一个已有的算法,并对这个算法进行严密的分析以研究其性能特征,将它和已有的算法进行对比以判断孰优孰劣,等等,这些问题主要是和数学相关的,由一些算法 Guru 和研究人员(在守卫森严的科技大楼内秘密地)进行。
当然,将算法简单地划分为实现和设计/分析两部分有点过于简单化了,因为它们实际上是无法分割的一个整体,比如说,离开分析的话,我们又怎么能确定算法的效率呢?而离开了效率的话,也就无所谓算法了,因为如果不考虑时间和空间效率的话,那么问题的任何一个正确的解就足以解决所有问题了。
不过,即便如此,我们也应该注意到,目前被广泛使用的绝大部分算法,都已经经过了详细而透彻的分析了,在很多时候,编程人员要做的就是根据已有的算法资料,选择一个合适的算法,然后实现它,这就完了,至于对算法进行分析的场景,一般来说也就非常少了。
如果对前面的几段话做一个总结,我们就得出了一个结论:比起学习算法分析,学习算法实现的相关知识要来得更有用和更实用。
然而,不幸的是,市面上销售的大部分算法书籍,以及人们推荐得最多的算法书籍,基本都是以算法分析为主,在这类算法书中,一个个优美的算法被分解成支离破碎的数学研究对象,在这些书里面,你会看见严谨的数学论证,完整的数学分析和(数学家写算法书赚外快时最喜欢用的难看的)伪代码,但是却看不见从低效算法逐步向高效算法推进的求精过程,看不见不同算法/数据结构之间的相似性和差异性,因为它们都被小心地隔离开来了。
这本《Algorithms in C》最难能可贵的地方就是,它是一本关注算法的实现和实用性的算法书:书中的示例程序使用的都是真实可运行的 C 代码;它详细地讲解了很多实际使用算法时会遇到的问题,比如说,内存占用、浮点数、随机算法的安全性和库的移植等问题;它还给出算法的完整的 API 和 client 端示例,并列出算法的实验分析结果,配合简短的描述来完整地展示算法的运行效率。
以上这些,都是算法在实际应用中需要关注的问题,但是,即使抛开这些实用性优点不说,这本书也是一本写得非常好的算法书:书中使用了大量的图片和图表来演示算法的完整执行过程,并且章节的安排也非常合理,新内容可以很自然地引申出来,沿着书一直读下去可以看到如何对一个算法进行改进,从低效到高效,再到最优化,这是学习算法中最有趣而又最能体现算法之美的地方,而这些有趣的部分,在那些将算法分解得支离破碎的算法分析书中,是不可能看到的。
---
补充:
似乎有部分评论说这本书的翻译不好,这套书的中文版和英文影印版我都有,我觉得这本书的翻译蛮不错的,也没发现什么明显的错误。
而且这套书原文的倒装句比较多,读起来比较慢,我个人还是推荐买中文版。
对于一个给定的问题,选择哪一种算法才是最适合的?选定算法之后,在编程环境中又是如何实现这个算法,是使用已有的库还是自己从头开始编写,是用 X 语言还是 Y 语言?这个算法实现和已有的程序结合得如何,需要对它进行修改吗?它的实际运行速度是快是慢?
以上这些,都是算法在实现阶段需要考虑的问题,这些问题主要是和工程相关的,是大部分编程人员日常工作中最常见也是最重要的部分。
另一方面,设计一种崭新的算法,或者改进一个已有的算法,并对这个算法进行严密的分析以研究其性能特征,将它和已有的算法进行对比以判断孰优孰劣,等等,这些问题主要是和数学相关的,由一些算法 Guru 和研究人员(在守卫森严的科技大楼内秘密地)进行。
当然,将算法简单地划分为实现和设计/分析两部分有点过于简单化了,因为它们实际上是无法分割的一个整体,比如说,离开分析的话,我们又怎么能确定算法的效率呢?而离开了效率的话,也就无所谓算法了,因为如果不考虑时间和空间效率的话,那么问题的任何一个正确的解就足以解决所有问题了。
不过,即便如此,我们也应该注意到,目前被广泛使用的绝大部分算法,都已经经过了详细而透彻的分析了,在很多时候,编程人员要做的就是根据已有的算法资料,选择一个合适的算法,然后实现它,这就完了,至于对算法进行分析的场景,一般来说也就非常少了。
如果对前面的几段话做一个总结,我们就得出了一个结论:比起学习算法分析,学习算法实现的相关知识要来得更有用和更实用。
然而,不幸的是,市面上销售的大部分算法书籍,以及人们推荐得最多的算法书籍,基本都是以算法分析为主,在这类算法书中,一个个优美的算法被分解成支离破碎的数学研究对象,在这些书里面,你会看见严谨的数学论证,完整的数学分析和(数学家写算法书赚外快时最喜欢用的难看的)伪代码,但是却看不见从低效算法逐步向高效算法推进的求精过程,看不见不同算法/数据结构之间的相似性和差异性,因为它们都被小心地隔离开来了。
这本《Algorithms in C》最难能可贵的地方就是,它是一本关注算法的实现和实用性的算法书:书中的示例程序使用的都是真实可运行的 C 代码;它详细地讲解了很多实际使用算法时会遇到的问题,比如说,内存占用、浮点数、随机算法的安全性和库的移植等问题;它还给出算法的完整的 API 和 client 端示例,并列出算法的实验分析结果,配合简短的描述来完整地展示算法的运行效率。
以上这些,都是算法在实际应用中需要关注的问题,但是,即使抛开这些实用性优点不说,这本书也是一本写得非常好的算法书:书中使用了大量的图片和图表来演示算法的完整执行过程,并且章节的安排也非常合理,新内容可以很自然地引申出来,沿着书一直读下去可以看到如何对一个算法进行改进,从低效到高效,再到最优化,这是学习算法中最有趣而又最能体现算法之美的地方,而这些有趣的部分,在那些将算法分解得支离破碎的算法分析书中,是不可能看到的。
---
补充:
似乎有部分评论说这本书的翻译不好,这套书的中文版和英文影印版我都有,我觉得这本书的翻译蛮不错的,也没发现什么明显的错误。
而且这套书原文的倒装句比较多,读起来比较慢,我个人还是推荐买中文版。
有关键情节透露