一、什么是数据结构,什么是算法
过于学术的概念定义比较抽象,难以理解。我们从广义和狭义两个层面,来理解数据结构与算法这两个概念。
1. 广义角度
从广义上讲,数据结构就是指一组数据的存储结构(怎么放),算法就是操作数据的一组方法(怎么用)。
我们以图书馆的场景为例来进一步理解:
图书馆书籍量十分巨大,首先要分类设置阅览室,譬如社科类、科技类、报刊类等。每个阅览室内,再根据图书的索引号排列摆放。这就是“数据结构”。当我们想借阅某本书时,可以到每个阅览室去,一本一本地找,也可以通过检索索引号,直接到对应的阅览室去查找。这些不同的查找方式,其实就是“算法”。
2. 狭义角度
从狭义上讲,是指某些典型的数据结构和算法。比如队列、栈、堆、二分查找、动态规划等。
二、数据结构和算法的关系
数据结构和算法这两个概念,有点“焦不离孟,孟不离焦”的意思。我们之所以总是把它们放在一起,是因为数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构是没有用处的。
三、学习重点
1. 复杂度分析
数据结构和算法的目的是更省、更快地存储和处理数据,因此需要一个考量效率和资源消耗的方法,这就是复杂度分析。它是这门课的内功根基,一定要掌握。
2. 数据结构与算法主体
我们首先来看一张框架图,以便对数据结构与算法建立整体认识:
作为非算法工程师,并不需要掌握上图所有知识点。很多高级的数据结构与算法在日常开发中很少用到,比如二分图、最大流等。学习要抓主要矛盾,攻克下面两个“十大”,就足够应对面试和日常工作了:
十大数据结构
数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;
十大算法
递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就很容易上手。
四、学习方法
学习数据结构和算法,是非常好的思维训练过程,不能死记硬背,要多辩证思考,多问为什么。
抓住四个问题:
-
- 来历
- 自身的特点
- 适合解决的问题
- 实际的应用场景
1. 边学边练,适度刷题
- 学习过程中要动手实操
- 每周末用集中时间把当周所学的数据结构和算法,自己用代码实现一遍
面试前刷题要适量,不要浪费太多时间。除非你要面试 Google、Facebook 这样的公司,它们的算法题目非常非常难,必须大量刷题,才能在短期内提升应试正确率。如果是应对国内公司的技术面试,即便是 BAT,只要熟练掌握原理,适度练习,就足以应对。
2. 多思考、多讨论
3. 限定时间
上大学时看新东方的单词课,其中一个观念让我受益匪浅:学习一定要设立详尽的时间规划,不要把战线拉得太长,用集中的时间来完成学习。否则一个学期过去,你可能还停留在 abandon。我认为这是个通用的道理,学习数据结构和算法,也要给自己制定好时间规划。
4. 小目标
在枯燥的学习过程中,可以给自己设立一个切实可行的目标,就像打怪升级一样。比如,每部分学完都写一篇博客,或者找找资料中讲得有误或者可以改善的地方。这样可以使学习形成积极的反馈。
5. 多重复
学习是反复迭代、不断沉淀的过程,不要期望一蹴而就。有些知识点学了一遍,不能透彻理解,这是正常的。反复学习几次,一定能“温故而知新”。