【来信】
老师,关于算法和数据结构我还是有点疑惑。你说要通过实践,我现在看到数据结构的图了,算法学习我借了刘汝佳的算法入门那本书,数据结构我把书中的代码在电脑上敲了出来,并且搞懂了第一行代码,也算是记住了思想。但是有时候敲完后会觉得模糊。算法在看动态规划,对于动态规划里面提到的“状态”我还是不能很好的理解。我想问问老师,如果长时间过后数据结构和算法的思想忘了怎么办,怎么学习数据结构和算法才算是正确的方法。学了将近20天的数据结构和算法,逐渐感觉到了别人所说的枯燥,到底如何安排学习这类知识的时间。问下,老师有没有算法的书籍推荐和比较明确的学习方法传授。谢谢老师。
【回复:逐点讨论】
老师,关于算法和数据结构我还是有点疑惑。 | |
你说要通过实践,我现在看到数据结构的图了, | ——你该告诉我你实践到什么程度了。 |
算法学习我借了刘汝佳的算法入门那本书, | ——是《算法竞赛入门经典》吗?这本书是好书,当作应用算法和数据结构解决问题的参考书即可。但是若你正在学习数据结构期间,却将之当主线,我觉得不妥。 |
数据结构我把书中的代码在电脑上敲了出来, | ——我怀疑你用的材料不当了。数据结构中算法的描述如果直接就用高级语言写出来了,很不利于你进入“抽象”的层次,这样学来的数据结构和算法,只能照猫画虎,眼前没猫,即使有虎,也画不出虎。 |
并且搞懂了第一行代码, | ——疑是“每一行代码”的笔误。看代码如果是以行作为单位,那学习效果可想而知了。要先知整体,再一大块一大块,再看大块中的小块。 |
也算是记住了思想。 | ——如果算法思想是记住的,忘了就一点都不奇怪了。 |
但是有时候敲完后会觉得模糊。 | ——因为你始终是只见树木,不见森林。这影响了你学习的速度和感受。 |
算法在看动态规划, | ——现在我感觉,你是将算法和数据结构分开学。算法学习的初期,算法可以有两种:一种算法是与数据结构紧密联系的,例如,各种基本数据结构上的基本操作,属于这一种;另一种,体现计算机求解问题方法层面的算法,例如动态规划、贪心等。这两者间有交叉。基于对你学习路线已有的了解,我建议将这两种分开一些,先第一种,后第二种。 |
对于动态规划里面提到的“状态”我还是不能很好的理解。 | ——再找些同类的书,这本书上的说法没有明白,再一本的说法可能就对你胃口了。用好学校的图书馆。 |
我想问问老师,如果长时间过后数据结构和算法的思想忘了怎么办, | ——忘了太正常了。理想的结果就是“得意而忘形”。而你前面描述的,试图是“得形而记意”。改变学法为要。例如排序算法,拿出一副扑克来,说用快速排序,就严格照其思想,手工玩出排序过程。这个玩的过程都可以不去考虑代码该怎么写。玩熟练了,可以用某种语言写一写程序。其他的算法,也要能够摆脱具体代码形态,以此去得意。这样学出来的,是不容易忘记的。关键是,做到了算法与语言无关。 |
怎么学习数据结构和算法才算是正确的方法。 | ——以上提示了一些,但也仅限于我的感觉。而对于你自己,要在学法上下功夫,你有更适合你自己的学法,只是没有想到去自己发现。 |
学了将近20天的数据结构和算法,逐渐感觉到了别人所说的枯燥, | ——这些知识实际是非常生动的,是学法不当所致。嘴里喊着枯燥,学这玩意就是活受罪。很多人就是这样进入到冬眠状态的。 |
到底如何安排学习这类知识的时间。 | ——感觉烦了累了就休息、调整一下,不要强求。不要指望过一遍就将知识掌握到一种很精通的程度,不可能。多轮次地学,每一轮,都深入一点点。初始的轮次,只求能学点皮毛即可,只求能解决点最简单的问题即可,不必指望一次学习,就能把竞赛类的题轻松做下来。刚会个三步上栏,就要打NBA,那不是自找不痛快吗?做不来的,放在那儿等着回头就收拾。用轻松的心态去学习,而不要这样焦燥。 |
问下,老师有没有算法的书籍推荐和比较明确的学习方法传授。 | ——现阶段,你就用好手边的书就行,而学习方法,我提示了一些。最适合你的方法,诞生在你自己的探索过程里。 |