阿夏是少年啦

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。

学习编程:一些并非那么初级的建议

dudulee的:

给麻子

Reprehensible side:

English version: http://www.facebook.com/notes/hongliang-liu/about-learning-programming-some-suggestions-for-non-beginners/10150926681362585

每次哥几个问我怎么学算法,我总是说,看《算法导论》。这书在国内有个缩写抄袭版,清华大学的《数据结构》,以前是绿皮很薄的那本。

 

后来同志们就去学《算法导论》,快的若干月,忙的一两年,后来他们又问说,我《算法导论》搞差不多了,接下来得怎么办呢?

 

我以前也很困惑这个问题,而且是在看完《算法导论》之前,这说明我是个深谋远虑的人。我就问高手们咋办,高手说,你只有不断的练习才能提高自己的境界。这仿佛让我想起来若干年前在北京上新东方想趁机去清华转转,路过问一大爷说“大爷,怎么去清华啊”,大爷说,“你只有刻苦学习努力考试才能去清华。”

 

类似大爷这样的建议没错,可是对编程来说,我觉得我更想知道的是蓝旗营下一站就下之类的具体建议。这里就是一些我的建议。

 

注意:如果你不知道 “double x[100000][100000]” 这行有什么问题,我觉得还是回头看看编程的书吧,或者这个网站不错  http://stackoverflow.com/

 

1. 怎么实现这些算法

 

如果不是为了应付考试而学习的话,这个问题的答案会比较有意义。《编程珠玑》上说,绝大多数人都不能保证在很短时间内写出来完全无错的快速排序代码。我曾经不信,后来写了一下我信了,我的边界条件有问题。这些得练的,亲。

 

市面上多数算法书都只列出伪代码,这样的目的为了清晰的讲解,却让学习者对实际编码不知如何下手。有一些人性化的出版物,比如《Algorithm in C++》(英文版),在这个问题上填补了市场空白,可以认真一看。一些网站也不错,比如 

 

http://en.literateprograms.org/Quicksort_(Python,_arrays)

 

其实,不仅需要练基本算法的无错快速实现,简洁的代码也是很重要的一项训练课程。比如说,大家都知道欧拉辗转相除求最大公约数,那么这个代码要几行?有人说怎么的也得四五行吧。所以我们得学习一下别人的简洁实现,两行就行。上面这个网站对各个基本算法都有简洁的实现,还有讲解哟。

 

总结一下,具体的实现这些算法,每个都认真写出来。

 

2. 那些数据结构怎么办?

 

我以前也不知道怎么办来着,因为一个树得放几个指针指向别的,一来一回我就懵了,更别说是图了。在多数编程语言里面,树和图都没有现成的内建数据结构,所以都得自己实现。

 

这个问题的提出主要是看到很多哥们准备面试题。很多一眼看上去都会做的,比如说,写出中序遍历一个树的C++代码。可是这些问题加上“写C++代码”这几个字,看起来就恐怖了。遍历很简单,《算法导论》有,可是实际编码以前没写过确实不容易下手。你得先实现个树,然后对这个树添加元素,然后再遍历吧。这是最简单的例子。一般的问题可能是,把一个树同一层的节点从左到右打印出来并且只允许使用O(1)的额外空间。这往往会吓的初学者不知所措:MD,树的实现我都写不出来,这从左到右不得。。。。。

 

很多这样的例子,看起来都是《算法导论》上喜闻乐见的,但是写就写不出来了,因为不会快速熟练的实现这些数据结构。我有一些建议:

 

维基百科有一些很好的例子,比如说

 

http://en.wikipedia.org/wiki/Tree_traversal

 

有一个印度哥们建的一个网站也很不错,叫做 http://www.geeksforgeeks.org/ 上面通过blog的形式,每次给出一个问题,并且从头到尾讲解如何解决这个问题。编码很细致,他们对于数据结构的实现可以认真学习。

 

总结一下,对于基本数据结构都认真的实现一下,熟练了之后很多问题都会很简单。同时也建议坚持练,这玩意得手熟。

 

3. 还有什么更加NB的可以练练么?

 

这答案就太多了,NB是没有上限一说的。我觉得吧,动态规划之类的值得认真练练。在谷歌搜索“dynamic programing”,第一页就有很多不错的网页。

 

Topcoder上也有高手们无私分享的算法教程,无价的知识的宝库之一:

 

http://www.topcoder.com/tc?d1=tutorials&d2=alg_index&module=Static

 

这里涵盖的方向很多,有些是竞赛常用的,有些对日常编程也很有益处,可以根据教程里提到的题目认真学习练习领会。

 

这部分的内容值不值得学这个问题的答案是见仁见智。为了找个编程的工作,其实不一定需要,我认识很多人都不知道DP是啥都年薪百万对吧。不过能和人家对于DP和最大流谈笑风生,也会至少显得专业一点。


评论
热度(6)
  1. woxinxie1234Reprehensible side 转载了此文字
  2. 阿夏是少年啦dudulee的 转载了此文字
  3. JoepherReprehensible side 转载了此文字
  4. dudulee的Reprehensible side 转载了此文字
    给麻子

© 阿夏是少年啦 | Powered by LOFTER