【数据结构与算法之美】01-如何抓住重点,系统高效地学习数据结构与算法?

一、什么是数据结构,什么是算法

  过于学术的概念定义比较抽象,难以理解。我们从广义和狭义两个层面,来理解数据结构与算法这两个概念。

1. 广义角度

  从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。简言之,数据结构解决数据“怎么放”,算法决定数据“怎么用”。

  我们以图书馆的场景为例来进一步理解:

  图书馆书籍量十分巨大,首先要分类设置阅览室,譬如社科类、科技类、报刊类等。每个阅览室内,再根据图书的索引号排列摆放。这就是“数据结构”。当我们想借阅某本书时,可以到每个阅览室去,一本一本地找,也可以通过检索索引号,直接到对应的阅览室去查找。这些不同的查找方式,其实就是“算法”。

2. 狭义角度

  从狭义上讲,是指某些典型的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。

二、数据结构和算法的关系

  数据结构和算法这两个概念,有点“焦不离孟,孟不离焦”的意思。我们之所以总是把它们放在一起,是因为数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构是没有用处的。

三、学习重点

1. 复杂度分析

  想要学习数据结构与算法,首先要掌握一个数据结构与算法中最重要的概念——复杂度分析。

  复杂度分析几乎占了数据结构和算法这门课的半壁江山,是数据结构和算法学习的精髓。数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此需要一个考量效率和资源消耗的方法,这就是复杂度分析。可以说,复杂度分析是九阳神功,有了内功根基,再学招式上手就很快了。

2. 数据结构与算法主体

  我们首先来看一张框架图,以便对数据结构与算法建立整体认识:

  

  当然,作为初学者或非算法工程师,我们并不需要掌握上图所有知识点。很多高级的数据结构与算法在日常开发中很少用到,比如二分图、最大流等。学习要抓主要矛盾,攻克下面两个“十大”,就足够应对面试和日常工作了:

  十大数据结构

  数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;

  十大算法

  递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。

  掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就很容易上手。

四、学习方法

  在学习数据结构和算法的过程中,一定要注意,不能死记硬背。要注意以下四个问题:“来历”、“自身的特点”、“适合解决的问题”、“实际的应用场景”。学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。

1. 边学边练,适度刷题

  数据结构与算法对实践要求很高。除了学习的过程中要动手实操,每周要再花 1~2 个小时的时间,集中把这周学习的内容涉及的数据结构和算法,全都自己写出来,用代码实现一遍。这样一定会比单纯地看或者听的效果要好很多。

  至于面试前的准备,刷题还是要适量,不要浪费太多时间在刷题上。除非你要面试 Google、Facebook 这样的公司,它们的算法题目非常非常难,必须大量刷题,才能在短期内提升应试正确率。如果是应对国内公司的技术面试,即便是 BAT,只要熟练掌握原理,适度练习,就足以应对。

2. 多思考、多讨论

3. 限定时间

  上大学时看新东方的单词课,其中一个观念让我受益匪浅:学习一定要设立详尽的时间规划,不要把战线拉得太长,用集中的时间来完成学习。否则一个学期过去,你可能还停留在 abandon。我认为这是个通用的道理,学习数据结构和算法,也要给自己制定好时间规划。

4. 小目标

  在枯燥的学习过程中,可以给自己设立一个切实可行的目标,就像打怪升级一样。比如,每部分学完都写一篇博客,或者找找资料中讲得有误或者可以改善的地方。这样可以使学习形成积极的反馈。

5. 多重复

  学习是反复迭代、不断沉淀的过程,不要期望一蹴而就。有些知识点学了一遍,不能透彻理解,这是正常的。反复学习几次,一定能“温故而知新”。

猜你喜欢

转载自www.cnblogs.com/murongmochen/p/12678628.html