看《算法导论》的一点感想 (转)

说实话,我没把那书看完,甚至没有看过1/10,至于做题就更没谱了,只要不是有人提起,我根本不知道哪个题居然在算导(下文简写成clrs)中出现过,但是我还要写一下我对这书的心得,看法和感受,尤其是和找工作的关系,供大家分享。 

  
1.为什么看这本书?个人认为是为了学习解决计算机科学普遍问题的方法论。该书的名称就是“导论”,本质上没讲几个算法,而是把900多页(我手头的电子版本)的篇幅都用在了算法证明,推导,分析上了,这些过程才是clrs希望大家掌握的知识,因为这些知识可以帮你分析远远超过clrs本身的知识体系。这里,大多数同学认为,我不想了解这些玩意,我看clrs,就是为了了解尽可能多算法,其实如果只有这一个目的,给大家推荐一个我经常翻来翻去的一本“书”:《吉大模板》,该书抛弃了clrs中的一切废话,将远远超越clrs容量的,以少/错一个字都不行的文本描述了大量基础算法。注意:这本书和类似的《浙大模板》(规模更大),《交大模板》(鬼畜版算法集合)在ACM/ICPC是可以带进场内自由翻阅的,想想为什么一个竞赛在允许这样的同时还受世界各大计算机公司的青睐? 
  
2.虽然凭大家的智商,硬啃本书没问题,但还是建议看本书之前,先把大学相关科目复习一遍。《离散数学》是必须要完全搞定的,要不算法分析部分会让你很抓狂。《数据结构》可以提前剧透clrs的一些基础内容,刚考研的同学们有福了。如果你在本科时选修过组合数学,运筹学等,特定章节你是完全可以直接跳过的,因为你当时学的东西比clrs上那点详细多了。另外,《概率论》,《高数/数分》,《形式语言&自动机》也会有直接的间接的帮助。如果你在大学时不是一心为了刷狗日的保研分,而是认认真真的把上面这些玩意学好,那看clrs基本就是玩票级轻松。 
  
3.为了让自己能答上面试的算法题(不管是下周还是3年后)而看这书的,希望你们考虑下,clrs给你带来了什么?3年前,如果你知道第K大还有O(N)的算法,3-sum还有O(N^2)的,基本上去百度是没啥问题了,但随着这几年程序员面试宝典之类的玩意泛滥,是个CS人就能答的上上面两个问题,面试管问的问题就水涨船高了,具体表现并不是问些clrs上没有的算法,而是clrs上算法的证明,组合和应用(当然狗搜还不厚道的搞起了TAOCP,操他妈的)。或是干脆不问算法了,改问分布式之类的新东西,如果你数据库学的很深,map/reduce或各种NoSQL上的那些深层次的优化你也可以讲出个大概。总之,不要希望穷举面试官的问题,clrs提供的问题真的不够问。如果说clrs对面试有什么效果,我希望它能帮助你提高自己的分析能力。面试官想看到的是解决问题的能力,不是问题的答案。不要怕面试官考你原题你不会,我实习的时候,经理和我聊起面试的应试策略,经理说,即使你搞不定某个题,如果你能提供个清晰的思路,效果要比你直接给出正确答案好得多,当然他也提到了,现在校招的难度比较高,人人都看过算法宝典,基本的算法题都会背,严重影响了算法本身的考察能力。 
  
4.亲自动手做课后题绝对是个好方案,当然今天做的明天就可以忘了,关键是,这些题都是精心设计的,为的是训练你的算法分析能力,既然训练到位了,还记得题目本身干什么?原因参见3。 
  
5.我个人只用clrs当工具书,如果某人提了个算法,我发现我对它的正确性证明,复杂度证明并不了解,我回抽出时间去认真看一章。但我没毅力去完全翻一遍。 
  
6.看英文版的clrs没比中文版的多出多少时间,因为大多数时间你都耗在思考问题上了,中英文的差异可以忽略不计。在这说个例子,我的队友,高中搞过OI,一些解题报告都是直接看波兰文的,不是因为会波兰文,而是波兰人写报告很喜欢用数学方法描述,看不懂波兰文,总能看懂公式把?当然基本的还是要懂的,例如TAK,NIE是啥玩意。 
  
7.学习clrs是有超级捷径的,但是没人会向你明示,因为让你浪费大量时间研读此书,他就可以抽出时间做别的事,获得很高的学习效率,取得竞争优势。学习效率是一个人的核心竞争力。希望你看到这个提醒,可以利用国际互联网探索下这个“超级捷径”是什么。 


一年前我问过同样的问题。。。。我来讲下读这本书的感受~读到现在也没读完一半~ 

首先,对于每个算法的证明以及分析,本来我以为这部分可以略去不看,记住一个结论就好了,后来发现我深深地错了,这一部分才是重点的重点精华的精华。 
其次,对于上面的代码(伪代码)有时候觉得真的就跟一坨屎一样。。。so that's all 
如果你只思想更多地掌握一些算法的实现 就看看算法的思想然后自己找点题目刷一刷就好 ;

如果你是想掌握这个算法 并且需要知道什么时候应当使用这个算法,并且需要给出准确的证明的时候,我觉得需要认真看一下算法的证明和分析 ;


当初那篇文章是写给希望静下心来搞一点学术的,但是现在发现,这样的人几乎不存在,也没必要存在,所以之后有人再问类似问题,我的回答一律是“扔一边别看” 
并不是瞧不起搞学术静不下心的,我工作了之后才发现,这个社会太浮躁,会杀死那些肯静下心来搞学术,但能力稍微欠缺的人,学术是个很金贵的东西,大多数人伺候不起她,所以也没必要都跑过去伺候。 
我估计现在搞算法的,目标基本上就是面试找个好公司,对于这些同学,既然不打比赛,以后也不想搞学术,还是少碰这样的砖头,不是说clrs不好或是嫌人家挫,而是读clrs的时间可以做一些更有效的事。 
如果不读研或是读本校,毕业就打算找个码农工作的,把程序员面试宝典,编程珠玑翻翻,然后找个上升期的创业公司实习半年最有效。 
我估计在算法版问类似问题的,99%符合这个答案。 

ps.我当初在学校那阵,就指望着ACM拿个奖,然后找个好工作,最后transfer去美帝,现在发现,第一条不是个必要条件,想达到第三条,应该把第一条的一半时间用来练口语,剩下的1/4找个妹子,最后1/4拿个区域赛铜走人;再彻底一点,ACM不打了,工作不找了,使劲刷GPA,直接出国读个ms搞定,不过我天生不喜欢做卷纸写作业,这条路对我的毅力是个挑战。 


你可能感兴趣的:(其它)