此系列名为Algorithm,实际应该叫做Data Structure & Algorithm,原因是两者不分家,通常是绑在一起的,记得我们的数据结构结构老师第一节课就告诉我们一句话:程序=数据结构+算法,后来学到的另一句话是数据结构定了,其上的算法就定了(抱歉,此两句的出处忘了),可见两者在程序员生活中的重要性和联系紧密性。事实上,大学的计算机课程软件方面对工作有比较大的帮助的我觉得就3门:程序设计语言、数据结构及算法、操作系统。如果说前者过于基本,后者过于理论的话,数据结构和算法实在是实用价值尤大。算法题在程序员面试中特别常见,估计很多人都会在此时想起来当时为啥没好好学学算法呢?^_^
此系列书籍分以下几类:
1.基础数据结构和算法的汇总、罗列、讲解,即大学的数据结构和算法课程教材类,Mark Allen Weiss的《Data Structures and algorithm Analysis》为其代表;
2.算法设计技术,即大学的算法设计教材类,Jon Kleinberg&Eva Tardos的《Algorithm Design》为其代表;
3.数据结构和算法编程实践,Jon Bentley 的《programming pearls》为其代表;
4.算法的数学基础类,此类书籍理论性很强,如果说以上在工作中的作用还是看得见的话,这类可以算是阳春白雪、高山流水了,代表有Ronald L. Graham &Ronald E. Knuth&/ Oren Patashnik的《Concrete Mathematics》等,本人还没上升到数学理论的阶段,此类书不述;
就个人阅读经验来看,建议的阅读顺序为读一本算法汇总类->编程实践类->上升到算法设计理论;这些书通常不会太厚,阅读起来时间差不多,最主要的功夫要花在做题上,否则看过后很容易就忘了!
几点感想:
1.算法似乎很飘忽,因为工作中实际上用得并不多,除了面试时^_^,深入研究的话,那么好像又都是数学了,但其对思维的锻炼作用不可忽视,对吧?我们程序员是不是需要严密的逻辑思维呢?
2.算法的学习容易陷入一个圈子,一看就懂,一学就会,可是放书就忘,用的时候想不起来具体是咋回事!比如说吧,我在部门曾当过一段时间的面试官,其中笔试有一道题是快速排序,我评卷的记忆是得分率不到1/3!面试提问对常见排序算法的理解,稍加变化就很难答上来,比如只需要选出N个数中前M个数等,事实上这都不难对吗?
3.怎么避免2中这个问题呢?书中告诉了我们算法是这样的,但少见告诉我们为啥是这样?我的感觉是:1.探究算法的来源,就是怎么才能想出这样解决?该算法有什么逻辑必然性?2.实践:包括解题、编程等。
4.学习算法需要专注,不要浮躁,否则最好只留下一些模糊的记忆,需要的时候又想不起来。
让我们进入算法的世界吧!