【来信】
在上学期,突然一天一位学长问我要选择哪个方向,指的是算法和一般的开发。我回答他算法,而他说我对语言学的太心急,太快,不像是喜欢算法的,并和我说算法玩玩就好,不要陷得太深,并建议我走一般开发的路子。虽然学长学的挺好,但就比我大一岁,我还是不太相信他说的。后来在学校acm实验室纳新时,我还是按捺加不住入了。
加入后,我开始对算法有了一点了解,并开始学习算法。本来我就是在我校oj上刷刷题。放假时借了本 《算法之道》,想在假期恶补一下,可是发现看不太懂。索性就不看了。因为acm实验室的题目在hdu上,我也转移到了hdu刷题。后来碰到不会的题,问了一下学长,他看完题告诉我该去学习动态规划了。于是我开始看博客,找动态规划的题目和讲解,后来发现一个博客上面讲的挺好,就一直在那个博客看,看到图的时候,我懵了,那时候我还不知道什么是数据结构,于是我又开始学数据结构。我想数据结构和算法同时学习。开始发现了一本很简单的书《啊哈算法》,在快看完时,我发现这本书讲的数据结构比较浅显,而且还不全,很多内容都在还没出版的下一册书上,我感觉对数据结构的讲解也有点乱,而且我对里面的数据结构看的也是模模糊糊,因为书内讲的太少,我也练的少,于是在快开学时我放弃了这本书。打算从头开始系统的系统的学习数据结构,于是找了好多书,找到了一本《大话数据结构》从头开始学习,然后去找对应的题目去练习,我也跟着实验室学长的步子,在hdu做练习,贪心,动态规划。可是我还没练熟呢,学长就切换到另一种算法了。当我意识到我的种种问题并打算从新开始时,也快开学了。开学后我在学数据结构做习题时担心我的算法学习。练习贪心和动态规划时又担心我的数据结构弄不太好。我什么都没学好。而且假期学的也因为练习过少,记住的并不太多。
我现在不知道在学习算法和学习数据结构之间该哪个先学,哪个后学。我怕我学了数据结构,算法学习上被人拉开。可是不学数据结构,有些涉及到数据结构的题目还搞不定。我想同时学习,现在的结果就是都懂点,仅仅是懂点。我对acm也不太了解,我不知道我先学了数据结构,再去学习算法会不会有点晚。。老师给指点一下,哪个在先,哪个在后,我对这两个的先后难以做出取舍。如果同时学,我肯定都学不好,因为还要抽出大量时间学C++,补习英语。我也感觉时间有点紧。我现在可纠结了。
【回复】
这封信看到一半的时候,我还真喜欢你东一榔头西一锤子的做法。作为一名大一的学生,就通过这样的方法去开阔视野,去到一个个未来要接触的空间中小试一把,这是很有价值的尝试。看到后面,我感觉应该和你探讨一种思路,怎样让自己的学习有序一些,有效一些。
你所谓的算法、数据结构,大概是受了现在开课的体系,或者是某本书的影响了。实际上,这样分开看,是将这二者之间的血肉联系断开了的。在学习过程中,如果能够始终将两者融为一体看,那才是全面的学习。对于大规模的人才培养而言,必然需要用一种体系,实施专业能力的培养。要知道,我们所用的体系,是诸多可以用的体系中的一种,而不是绝对的唯一。作为你个人,在培养方案以外,自己自主地去拓展一些,抛开这些束缚,形成自己的体系,方显出更大的价值。
实际上,我们所经历的基础教育,是人不敢也不会作个性化安排的教育。如果可能,在大学,我们可以尝试具备突破的能力。否则毕业时,都是同质的学生,说就业难,统统都难。同时,创新性也便少了许多。我希望你看到你之前学习的价值,少一些惊慌。《破除“系统学习”的情结》和《 改变学习模式,在课外学习中获得突破》两篇旧文供你参考。这两篇文章谈得范一些,而你现在有明确地目标,是在算法与数据结构这一专业中很重要的基本功方面要加强,是更简单些的问题。放弃一些束缚,按着让自己更有效的、更个性的方式学习吧。
以上是我对你面临问题的看法。而到具体安排的层面上,我觉得你一定不能落入到简单模仿学长的轨道中去。学长比你多一年的积累,他体会过的,你尚未经历,怎么能按他的步子走?我建议你现在也不必抱着一本数据结构的书“系统地学”,没有必要。两本比较浅显的书已经看过,建议你找一本专攻竞赛的书(红书、黑书,或其他)看,这样的书中的算法与数据结构是结合在一起的。若遇到里面讲的数据结构方面有些障碍了,也可以找本数据结构的课本,将相关的内容翻一翻,不排除将某段的内容深入学一下。要知道在用一本书时,不是拿到书,就从头到尾说要细读下去。大多数书,就是用到哪儿了,就看哪儿。一本书做主线,其余的都是帮衬。
有你信中所说的积累,C++对你不会是负担,而至于英语,以及其他的科目,做好自己的时间安排,让学习、生活的保持一定的节奏,都不是问题。
以上是我的观点,未尽之处,我们可以继续交流。祝学有所成!