最近开始学习数据结构和算法,看到一位前辈分享的学习经验,特地做了记录!
有时候我们埋头苦学,天真的以为照着书多敲代码就可以掌握知识点;其实并不然,在学习中往往出现照着书上敲代码,但敲完了并不知道那是干嘛的情况。这就是一些初学者很大的误区。所以当我们拿到代码时,可以先跟着作者思路走一遍,上手敲代码之前最好先在草稿纸上把代码一行行分析一遍,看看是不是作者的思路。往往书上的代码不会很长,而且里面会有一些编程技巧值得学习。最后再按照思路来编程,这时候你会发现一些前面两个步骤中没注意的问题。这些对我们的思维方式都有很大帮助。
数据结构虽然解决的是数据存储问题,但是在使用的层面上,我们不仅仅时因为存储数据而使用。更重要的时当我们使用某些特殊的数据结构存储数据后,将可以帮助我们更加高效的解决某些算法问题,甚至对于某些问题来说,如果某有这些数据结构我们根本无从解决!
1、记住数据结构,记住算法思想(是什么)
我觉得这个是数据结构与算法学习最基础的部分。学完之后,你至少得能给人说明白,什么是”堆栈“,什么是”平衡二叉树“等等等吧。我之所以说”记住“,是希望这些能够形成长久记忆,存储到你的”硬盘“里,而不仅仅在学习的时候过了一遍你的”内存“。还有一个问题,什么才叫”记住数据结构“。
我觉得,第一步,数据结构最直观的东西你得记住吧(如标题背景图,来自数据结构和算法动态可视(Chinese))。这种直观的记忆可能在不知不觉中就完成了,但为了更好的记住,还需去刻意记忆和偶尔的复习。
第二步,你得记忆该数据结构的定义与性质与特点等等等吧。例如,学习哈夫曼树的时候。哈夫曼树的定义:WPL(带权路径长度)最小的二叉树;哈夫曼树的特点:(1)没有度为1的结点(2)n个叶子结点的哈夫曼树共有2n-1个结点(3)哈夫曼树的任意非叶节点的左右子树交换后仍是哈夫曼树。关于”数据结构“,需要记忆的内容也需要自己在其中慢慢领悟。
至于”记住算法思想“,举个例子,思考我们如何构造一个”哈夫曼树“。当然,在知道它的定义后,我们可以自己去设计一个算法。如果,自己可以想出来,恭喜你。如果自己没想到,再看到先人的解决办法后,不是仅仅“惊叹”一声,更要去理解,去记住它。
2、用编程语言去实现某一数据结构上的算法(怎么办)
很多时候,理解一个算法很容易,很容易在纸上去模拟一个算法的实现过程。但,具体实现,则是另一回事。一定得先自己思考,然后再去看书中给的编程语言实现。在我看来,这一过程已经不属于“数据结构与算法”的内容了。
而是你综合素质的体现,如何真正理解问题和用编程技巧实现,很考验自己。这一过程,很难靠记忆。而在不断敲代码的过程中去体会一些直觉上的东西。如何用递归解决问题,如何使用循环,如何使用"哨兵”等等等等。当然,敲完后需要去思考总结,看看能不能总结出一些”小套路“并记住。
3、”记住“特定情景下,利用某一特定的数据结构,去解决问题
每介绍一种数据结构,浙大数据结构与算法的MOOC课程都会有一个实际问题来作为“引子”,回答了“这种数据结构为什么会出现”。有的是为了实现特定的操作,有的是为了时间和空间上(大部分考虑的是时间复杂性)效率的更高(所以,没事的时候,分析一下算法的时间复杂性)。这些东西,我们也须理解记忆。每一数据结构都有其特性,去解决某一类问题,我们需要去记忆,去感悟。
最后,在学习过程中,如何形成一个属于自己的知识体系(准备在“印象笔记”中单开一个“数据结构与算法”的笔记本);如何去“记住”(记好笔记,多多复习);在学习过程中,遇到挫折,产生挫败感该如何处理(这个是必然会发生的,总有难以理解不会的地方);如何进行心态方面的调整(欲速则不达,不过也有”敏捷学习“的概念)。