怎样学习算法 怎样学算法?

不请自来,不想系统地讲如何学算法,就随便聊聊我自己学算法的道路吧。

读高中前,自己学过 VB 和 C 语言,并在初中一个市级的计算机应用竞赛中拿过第一,考过微软 ATC 证书和国二级,还自己亲手创办过一个口袋妖怪主题网站,自豪感爆棚,感觉自己是未来的比尔盖茨。上了高中才知道有信息学奥林匹克竞赛这玩意儿,也知道竞赛班里有同学是靠这个竞赛初中组拿第一进的这所重高,顿时感觉自己比别人落后了一万步。

到了我高一 NOIP 的时候,我来到了机房边上的办公室,和竞赛的带队老师说:

「教练,我想学算法。」

……

……

假的,我只是想报个名而已。

之后老师了解了一下我的情况,特别糗的一件事让我至今记忆犹新,老师问我,「学过数据结构吗?」我想了会儿说,「我用过数组啊链表什么的。」然后老师接着问,「那图论呢?」我没明白老师说的是什么,就问了「什么图?」老师说「就是画图的图。」我仿佛突然恍然大悟了一下,正色道:「我在 VB 里画过。」

于是我收到了一堆课件 PPT,交完报名费,黑着脸走出了办公室。


回到家插上 U 盘,看到一个个陌生的名词:「二叉树」、「动态规划」、「贪心」、「最短路」、「网络流」…… 我的算法之路就算正式开始了。

看了一个周末的 PPT,一行代码都没写,周一去的时候有一个 NOIP 赛前集训,其实就是做历年来的初赛卷。这个初赛卷里考的都还是比较基础的东西,加之正好周末对什么二叉树的前中后序遍历、栈和队列的出入方式有了一点点了解后,好像拿了70多分,跟高二拿过一等奖的学长也就差了10来分嘛,顿感自己是祖国未来编程的希望。
怎样学习算法 怎样学算法?

高三有个已经在 NOI 中夺金保送的学长,开始每天为我们授课。因为我是中间插班进去的,所以错过了前面不少基础课。我记得第一节课听的就是哈夫曼(Huffman)树,对于一个只知道二叉树遍历的我来说,用现在的话讲,那时的我就是黑人问号的好兄弟。

因为和学长并不熟,所以也没办法一下子就恬着脸让人家给我单独辅导。但我知道大家都在一个叫 USACO 的平台上做题,嗯,就是那个特别喜欢和奶牛过不去的平台。我也跟风注册了账号,这时候才知道信息学竞赛的大概流程,在顺利地获得了几个 Accepted 之后,心底里的好胜心一下子被激发出来了,我要刷完这个题库!

很显然,我马上就被各种 WA、TLE、MLE 给卡住了,去网上搜题解,搜出了一些莫名其妙的名词和充满 magic number 的代码(竞赛代码里的变量命名往往没啥逻辑),我觉得我是时候鼓起勇气,向学长大牛请教了。没想到的是,学长大牛非常平易近人,不但教会了我怎么解,还帮我罗列了相关知识点和平台上对应的题(记忆力惊人),这位学长在之后的 IOI 中总成绩排名第一夺得金牌,保送清华,和楼教主比肩,应该有不少人猜到了,就是俞华程,yuhch。

就这样,我在一个世界级顶级选手的指导下,坚强地在竞赛圈里活了下去,含泪。

USACO 马上已经不能满足我了,我跟着 yuhch 去征战了 URAL,但我觉得 URAL 上题目太多太杂了,又跟风去做了一波 POJ,之后我在这里有过一份关于 POJ 的整理: 我也买了《算法导论》,买了刘汝佳的黑书,买了严蔚的《数据结构》,买了《Algoritms》…… 但这些书我也就囫囵吞枣地过了一遍,看书哪有刷题有趣啊。

在 OI 中,我从 NOIP 到 NOI,倒在了浙江省集训队的冬令营选拔赛里,含恨结束了这段竞赛经历去参加高考,结果高考也失利未能如愿进入理想院府,但我并不后悔当初的选择。

到了大学,无脑填报了计算机科学与技术,报到前就了解了自己大学的 ACM 情况,所以进校后就来到了 ACM 校队参加了集训。ACM 组队的竞赛形式让我在心理上降低了一点压力,但一个测试点不过就不给分的评分方式在当时的我看来有点无法理解,我意识到我需要更系统全面的学习算法和数据结构,不能再像以前在 OI 中凭着一些小聪明在有限时间内去「骗」尽可能多的分数,就比如对有限测试数据打表,对所有情况离线枚举计算,对答案随机输出或者输出若干样例等等。这时候我才重新拾起了《算法导论》,看懂算法原理,做到举一反三。

什么叫举一反三?当你看完快速排序后,你就能给我一个时间复杂度为 O(N) 的求中位数的算法。从我面试的同学来看,9成以上的同学能大概解释清楚快速排序的过程,却有一半的同学无法在我的指引下,说清楚求中位数的线性时间复杂度解。这就是我认为大部分同学,即使学了算法,也无法真正将其应用起来的原因。

到这个时候,其实我已经认为我掌握了基础的算法和数据结构(掌握的定义就是要求能举一反三),开始向更高级的方向前进。但竞赛圈真的是一个很能让我看清自己水平的地方,虽然省赛中拿金,但也在区域赛中打过铁,告诉你努力也并不能带来回报,天赋在这里可能会显得更重要。中二的时候我也做过门萨测试和一些山寨的智商测试(比如那个纯图形的IQ-Test),大概在135-140之间浮动。但在比赛的时候,有些地方你没想明白没想通就是死活找不到最优解,或者掉进出题人的陷阱中。在大三大四中,我 quit 掉了一部分 ACM 精力,转去学习 Machine Learning,最后也仅仅以亚洲区域赛银牌的最高成绩结束了我 7 年的竞赛生涯。

其实竞赛刚退役那会儿,我并不想像许多选手那样,在自己博客上洋洋洒洒写一篇退役回忆录。因为我在这 7 年中,留下了太多遗憾,甚至在写进简历中的时候,还觉得有点丢脸。直到现在工作到了第四个年头,我才慢慢看开了这一切。在竞赛这个舞台上,能拥有亮丽光环受人顶礼膜拜的,那真的是万里挑一。但其他人就差吗?我想并不,和我一起不幸打铁的队友,是学院中专业课 GPA 第一名,去了美帝 CMU 读研,现在已在一家我听都没听说过的叫 Facebook 的公司做算法。如果你在竞赛中被虐到怀疑人生,没关系,99.9% 的人和你有相同的感受。

最后点个题,高票回答好像都是在推荐书籍,我倒觉得不必。给我两个题库和一个搜索引擎,我就能学完基础算法和数据结构,并且掌握得一定比看书要来得扎实得多得多。学算法还是非常非常需要靠实践的,有非常多的细节不是你在看书的时候能掌握的,就比如带 lazy 标记的线段树、带 heap 优化的 Dijkstra、AC 自动机等等。不然你面试的时候,白板编程这关一定过得不漂亮。

-----------------------------------------------------------------

如果你对以下问题感兴趣,欢迎来到我的 Live:
* 为什么面试官都喜欢考程序员基础算法?
* 如何高效、系统性地学习算法和数据结构?
* 为什么大家普遍觉得动态规划较难理解?
* 学算法是否有必要参加 OI / ACM 等算法编程竞赛?
* 如何平衡自己在算法、竞赛上和其它方面学习的精力投入?
* 学习传统算法对日后工作的帮助具体有多大?
* 学习传统算法对学习机器学习的帮助具体有多大?
传送门:
  

爱华网本文地址 » http://www.413yy.cn/a/81130103/7551.html

更多阅读

洛克王国,怎样学习百变液化术?

洛克王国的百变液化术要怎么学习呢?洛克王国,怎样学习百变液化术?——学习方法洛克王国,怎样学习百变液化术? 1、点开任务档案-成长之路-魔法之路-液化术课程选择现在就过去! 洛克王国,怎样学习百变液化术? 2、来到实验工坊点击爱因斯坦对

怎样学跳交谊舞 学习舞蹈哪里好

交谊舞比较好学,而且比较受欢迎,它是你在舞厅受欢迎的一个必不可少的关键因素。下面告诉大家集中学跳交谊舞的方法,我已经就是这样学的。怎样学跳交谊舞——步骤/方法怎样学跳交谊舞 1、找个舞伴在朋友中找个会跳交谊舞的当舞伴,让他

高中生怎样学好物理?高中物理学习方法

在高中理科各科目中,物理是相对较难学习的一科,学过高中物理的大部分同学,特别是物理成绩中差等的同学,总有这样的疑问:“上课听得懂,听得清,就是在课下做题时不会。”这是个普遍的问题,值得物理教师和同学们认真研究。那么,高中生怎样才能学

怎样学剑网3洛道扶摇 剑网3洛道任务

扶摇,就是一个让各位侠士们能飞的更高看的更远的一个神技,各个门派的侠士们都可以学习。扶摇一共有11重,它们分布在各个你不知道的角落,其中有两个洛阳和洛道的扶摇是根据完成任务获得的,这次先来说下洛道的扶摇直上在哪里学,需要完成哪些

新手怎样学计算机知识? 大学计算机基础知识

新手怎样学计算机知识?——简介 如今计算机已经普及,我们的生活已经离不开计算机,很多我们看不到的东西,都是由计算机完成。那么作为一个新手,没有任何计算机基础,如何学习计算机知识?新手怎样学计算机知识?——方法/步骤新手怎样学计算机

声明:《怎样学习算法 怎样学算法?》为网友嫒匛見仌惢分享!如侵犯到您的合法权益请联系我们删除