这几天七七八八,也不知道自己在忙什么。似乎就是没心情继续到这里写东西。打了几天游戏,用java写了一个网络仿真软件用来测试p2p设计的性能,改改小bug,时间就这么过去。 希望没人在这里等我的下文,不然就惭愧死人了。
言 归正传,回来继续讲我们的正题。 翻翻前面的帖子,对于数据结构和算法,我已经啰嗦了一堆他们的重要性。接下来改说哪本数据结构或者算法的书写得好把,看看网上这类的帖子文章已经论斤卖 了,再写也没多少意义了。况且自己不是算法狂人,所看过的算法书也就那么基本粗浅的而已,自然不敢出来挨砖。想想能拿出来和大家分享的,依然是自己的一些 看法和认识而已。
数据结构和算法
算法这两字其实到今天我还是稀里糊涂的,每次读算法书,前言或者序言第一句话肯定就有定 义。反正本科看了一回,硕士的时候学算法又看了一回。至今好像也没再看过第三回。也不记得书上是怎么定义的,发展觉得就是特经典,精辟的那种,但是过眼就 记不得。没事和朋友吹牛的,三句话不离本行,十句话肯定是不离算法的:大部分口水是为“算法”喷的;码的代码大多数也是在解决算法问题。 但是对于算法到底是啥,我却不愿意深究其定义,因为我知道揪出来也没意义,它能基本涵盖一个程序员所有的有用功——就好像你问人吃啥,他说吃饭, 你绝对不会去再问一句饭吃的啥了。
在这里,我有兴趣做的,倒是如何把算法和数据结构来个“实用性”分类。所谓实用性就是我不在乎分的对不对,靓不靓,只从合乎情理来分。从对算法和数据结构的逐步深入理解来分,可以分为这么三类:
(1)基本数据结构和基础算法:编程语言和数据结构,针对对编程语言的掌握
(2)通用算法:针对理论问题的探讨
(3)专用算法:金融,路由
这 也对应三个不同学习和使用算法和数据结构的阶段。 虽然这分法有点老土,但是也是经过我也是仔细琢磨,觉得最合情理的分法。 首先(1)明显区别与(2)(3):前者是“就事论事”,属于掌握编程语言的内容,换句“课堂用语”来说就是为了解决编程实现域中知识技能;后两者是为了 解决实际应用问题,属于“应用域”。会了(1),你就基本掌握了啥是编程了,会了(2)(3)你才算是有点“生产力”,能挣公分了。(1)是大多数学计算 机的人所要关注的,而其他学科未必注重这个。(2)主要是计算机做理论方面的人在捣鼓 ,和一些职业的应用数学家(3)则是渗透到各个行业中了。 所以能掌握(3)的人是各行业里赚钱的;会(2)的人呢小康是有保障属于技术工种;。剩下的只会(1)的人,就是标榜为IT民工的各位了。这也就是为什么 大家都说做IT都是打工的,只能给其他行业的人当枪使。事实也的确如此,大多数人从科班出身人,能把(1)能真正掌握做好就不多,(2)就需要去花很多的 时间去看什么《算法的艺术》 《算法导论》和有相对比较好的数学底子了。(3)就往往需要在计算机之外有数学的功力和行业的背景知识了。所以说,时下流行的:少壮不努力,老大做IT, 也是有一定道理的。
上面这堆废话对已经入行的朋友没有什么意义,大家就权且一笑;但是如果正准备开始学习编程,那还是应该把这些记在心里的。很多时候,决定你以后发展的并不是你学的是什么,而在于你对全局的把握。这也是我废话这么多的初衷。
言 归正传, 如何学好第一步。答案很简单,也很让人失望: 学好算法和数据结构的最好办法就是把所学的背下来,默写出来。这有点类似英语学习,基本功就是背单词和句型。之所以强调要背要默的原因,第一是由于这是以 后的基础;第二是以后再也不会有这样的机会让你来做这些基础功课。这点上往往是科班程序员和票友程序员之间的分水岭。科班程序员大多在入门的时候被老师逼 着去做这样那样的功课, 虽然不情愿但是这些基本功对以后的确意义重大;票友程序员往往没有这样的压力, 在学习中回避这些基本功,其结果也是人浮于事,之后的内容也学不进去。 这里说说我当时的学习。我的数据结构老师很不错,上课用的是南加州大学的老教程,我喜欢把里面的例程算法都仔细看透,琢磨是否可以优化。做作业的时候是我 最惨的时候。当时软盘都很少用, 程序都是自己写在作业本上交老师批改的。 女孩子们喜欢打草稿,反正他们的作业都干净要命。我是粗线条那种, 不喜欢做门面功夫,那就得力求一次性在作业上把程序从头到尾都一次写出来。这当然不可能了, 即便在计算机上编程,也不可能一次性把整个程序都写出来。所以我的本子总是涂涂改改的特别恶心。 成绩当然不高,即便程序是对的,老师也不愿意给如此恶心的作业打高分。 为了提高成绩,只能少涂改,那只能要求我自己在脑子里面进行“脑中作业”,因为上机的时间实在是不多,还得自己花钱买上机票。另外一个办法就是背住所学的 算法, 背住的越多,脑中作业的脑力花费越少。于是这无形中极大强化了我对算法的掌握。后来我看其他同学做作业都要翻书抄书上的例程再改就很不屑, 因为我做作业的时候从来不打开书的。 考试的时候是开卷,我就很牛逼的连书都不带哗哗哗的写完交卷,爽!后来在学算法设计,操作系统,编译原理和计算机图形学的时候,我基本都是把书上的伪代码 实现出来,写成完整的系统(现在回想当年花了3个星期实现一个pascal编译器,真是太痛苦了,后来知道有lex和yacc,真是郁闷了很久)。不过这 些东西到现在对我来言都是极大的资本。
言 归正传,回来继续讲我们的正题。 翻翻前面的帖子,对于数据结构和算法,我已经啰嗦了一堆他们的重要性。接下来改说哪本数据结构或者算法的书写得好把,看看网上这类的帖子文章已经论斤卖 了,再写也没多少意义了。况且自己不是算法狂人,所看过的算法书也就那么基本粗浅的而已,自然不敢出来挨砖。想想能拿出来和大家分享的,依然是自己的一些 看法和认识而已。
数据结构和算法
算法这两字其实到今天我还是稀里糊涂的,每次读算法书,前言或者序言第一句话肯定就有定 义。反正本科看了一回,硕士的时候学算法又看了一回。至今好像也没再看过第三回。也不记得书上是怎么定义的,发展觉得就是特经典,精辟的那种,但是过眼就 记不得。没事和朋友吹牛的,三句话不离本行,十句话肯定是不离算法的:大部分口水是为“算法”喷的;码的代码大多数也是在解决算法问题。 但是对于算法到底是啥,我却不愿意深究其定义,因为我知道揪出来也没意义,它能基本涵盖一个程序员所有的有用功——就好像你问人吃啥,他说吃饭, 你绝对不会去再问一句饭吃的啥了。
在这里,我有兴趣做的,倒是如何把算法和数据结构来个“实用性”分类。所谓实用性就是我不在乎分的对不对,靓不靓,只从合乎情理来分。从对算法和数据结构的逐步深入理解来分,可以分为这么三类:
(1)基本数据结构和基础算法:编程语言和数据结构,针对对编程语言的掌握
(2)通用算法:针对理论问题的探讨
(3)专用算法:金融,路由
这 也对应三个不同学习和使用算法和数据结构的阶段。 虽然这分法有点老土,但是也是经过我也是仔细琢磨,觉得最合情理的分法。 首先(1)明显区别与(2)(3):前者是“就事论事”,属于掌握编程语言的内容,换句“课堂用语”来说就是为了解决编程实现域中知识技能;后两者是为了 解决实际应用问题,属于“应用域”。会了(1),你就基本掌握了啥是编程了,会了(2)(3)你才算是有点“生产力”,能挣公分了。(1)是大多数学计算 机的人所要关注的,而其他学科未必注重这个。(2)主要是计算机做理论方面的人在捣鼓 ,和一些职业的应用数学家(3)则是渗透到各个行业中了。 所以能掌握(3)的人是各行业里赚钱的;会(2)的人呢小康是有保障属于技术工种;。剩下的只会(1)的人,就是标榜为IT民工的各位了。这也就是为什么 大家都说做IT都是打工的,只能给其他行业的人当枪使。事实也的确如此,大多数人从科班出身人,能把(1)能真正掌握做好就不多,(2)就需要去花很多的 时间去看什么《算法的艺术》 《算法导论》和有相对比较好的数学底子了。(3)就往往需要在计算机之外有数学的功力和行业的背景知识了。所以说,时下流行的:少壮不努力,老大做IT, 也是有一定道理的。
上面这堆废话对已经入行的朋友没有什么意义,大家就权且一笑;但是如果正准备开始学习编程,那还是应该把这些记在心里的。很多时候,决定你以后发展的并不是你学的是什么,而在于你对全局的把握。这也是我废话这么多的初衷。
言 归正传, 如何学好第一步。答案很简单,也很让人失望: 学好算法和数据结构的最好办法就是把所学的背下来,默写出来。这有点类似英语学习,基本功就是背单词和句型。之所以强调要背要默的原因,第一是由于这是以 后的基础;第二是以后再也不会有这样的机会让你来做这些基础功课。这点上往往是科班程序员和票友程序员之间的分水岭。科班程序员大多在入门的时候被老师逼 着去做这样那样的功课, 虽然不情愿但是这些基本功对以后的确意义重大;票友程序员往往没有这样的压力, 在学习中回避这些基本功,其结果也是人浮于事,之后的内容也学不进去。 这里说说我当时的学习。我的数据结构老师很不错,上课用的是南加州大学的老教程,我喜欢把里面的例程算法都仔细看透,琢磨是否可以优化。做作业的时候是我 最惨的时候。当时软盘都很少用, 程序都是自己写在作业本上交老师批改的。 女孩子们喜欢打草稿,反正他们的作业都干净要命。我是粗线条那种, 不喜欢做门面功夫,那就得力求一次性在作业上把程序从头到尾都一次写出来。这当然不可能了, 即便在计算机上编程,也不可能一次性把整个程序都写出来。所以我的本子总是涂涂改改的特别恶心。 成绩当然不高,即便程序是对的,老师也不愿意给如此恶心的作业打高分。 为了提高成绩,只能少涂改,那只能要求我自己在脑子里面进行“脑中作业”,因为上机的时间实在是不多,还得自己花钱买上机票。另外一个办法就是背住所学的 算法, 背住的越多,脑中作业的脑力花费越少。于是这无形中极大强化了我对算法的掌握。后来我看其他同学做作业都要翻书抄书上的例程再改就很不屑, 因为我做作业的时候从来不打开书的。 考试的时候是开卷,我就很牛逼的连书都不带哗哗哗的写完交卷,爽!后来在学算法设计,操作系统,编译原理和计算机图形学的时候,我基本都是把书上的伪代码 实现出来,写成完整的系统(现在回想当年花了3个星期实现一个pascal编译器,真是太痛苦了,后来知道有lex和yacc,真是郁闷了很久)。不过这 些东西到现在对我来言都是极大的资本。
其次,我还想在这个话题下多说一句: 不要为了算法去专业算法。很多年轻人总是在我面前炫耀自己读完了《算法导论》第几卷,里面某某算法设计多难,自己都看懂了。但是我绝对不建议任何年轻的程 序员去看这种书。原因有二: 第一,这种书属于(2)的范畴,需要了解,但是不需要去啃懂每个算法,好比是新华字典,对每个中国人都很重要,但是那是工具书,没人会去把整本啃完,没有 意义;第二,做编程这行,变化太快,等印在纸上了,那些都已经是过时的死东西了,等你啃完前人的骨头了,你也差不多该作古了。
本文转自nathanxu 51CTO博客,原文链接:http://blog.51cto.com/nathanxu/114310,如需转载请自行联系原作者