<audio id="audio" title="《数据结构与算法之美》学习指导手册" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4c/80/4cb2010b28b77652de60e0d9b1aa6480.mp3"></audio>

你好，我是王争。

在设计专栏内容的时候，为了兼顾不同基础的同学，我在内容上做到了难易结合，既有简单的数组、链表、栈、队列这些基础内容，也有红黑树、BM、KMP这些难度较大的算法。但是，对于初学者来说，一下子面对这么多知识，可能还是比较懵。

我觉得，对于初学者来说，先把最简单、最基础、最重要的知识点掌握好，再去研究难度较高、更加高级的知识点，这样由易到难、循序渐进的学习路径，无疑是最合理的。

基于这个路径，我对专栏内容，重新做了一次梳理，希望给你一份具体、明确、有效的学习指导。我会写清楚**每个知识点的难易程度、需要你掌握到什么程度、具体如何来学习**。

如果你是数据结构和算法的初学者，或者你觉得自己的基础比较薄弱，希望这份学习指导，能够让你学起来能更加有的放矢，能把精力、时间花在刀刃上，获得更好的学习效果。

下面，我先给出一个大致的学习路线。

<img src="https://static001.geekbang.org/resource/image/54/48/54163f16e152f71b8f91d3fba652cf48.jpg" alt="">

现在，针对每个知识点，我再给你逐一解释一下。我这里先说明一下，下面标记的难易程度、是否重点、掌握程度，都只是针对初学者来说的，如果你已经有一定基础，可以根据自己的情况，安排自己的学习。

## 1.复杂度分析

尽管在专栏中，我只用了两节课的内容，来讲复杂度分析这个知识点。但是，我想说的是，它真的非常重要。你必须要牢牢掌握这两节，基本上要做到，简单代码能很快分析出时间、空间复杂度；对于复杂点的代码，比如递归代码，你也要掌握专栏中讲到的两种分析方法：递推公式和递归树。

对于初学者来说，光看入门篇的两节复杂度分析文章，可能还不足以完全掌握复杂度分析。不过，在后续讲解每种数据结构和算法的时候，我都有详细分析它们的时间、空间复杂度。所以，你可以在学习专栏中其他章节的时候，再不停地、有意识地去训练自己的复杂度分析能力。

难易程度：Medium

是否重点：10分

掌握程度：在不看我的分析的情况下，能自行分析专栏中大部分数据结构和算法的时间、空间复杂度

## 2.数组、栈、队列

这一部分内容非常简单，初学者学起来也不会很难。但是，作为基础的数据结构，数组、栈、队列，是后续很多复杂数据结构和算法的基础，所以，这些内容你一定要掌握。

难易程度：Easy

是否重点：8分

掌握程度：能自己实现动态数组、栈、队列

## 3.链表

链表非常重要！虽然理论内容不多，但链表上的操作却很复杂。所以，面试中经常会考察，你一定要掌握。而且，我这里说“掌握”不只是能看懂专栏中的内容，还能将专栏中提到的经典链表题目，比如链表反转、求中间结点等，轻松无bug地实现出来。

难易程度：Medium

是否重点：9分

掌握程度：能轻松写出经典链表题目代码

## 4.递归

对于初学者来说，递归代码非常难掌握，不管是读起来，还是写起来。但是，这道坎你必须要跨过，跨不过就不能算是入门数据结构和算法。我们后面讲到的很多数据结构和算法的代码实现，都要用到递归。

递归相关的理论知识也不多，所以还是要多练。你可以先在网上找些简单的题目练手，比如斐波那契数列、求阶乘等，然后再慢慢过渡到更加有难度的，比如归并排序、快速排序、二叉树的遍历、求高度，最后是回溯八皇后、背包问题等。

难易程度：Hard

是否重点：10分

掌握程度：轻松写出二叉树遍历、八皇后、背包问题、DFS的递归代码

## 5.排序、二分查找

这一部分并不难，你只需要能看懂我专栏里的内容即可。

难易程度：Easy

是否重点：7分

掌握程度：能自己把各种排序算法、二分查找及其变体代码写一遍就可以了

## 6.跳表

对于初学者来说，并不需要非得掌握跳表，所以，如果没有精力，这一章节可以先跳过。

难易程度：Medium

是否重点：6分

掌握程度：初学者可以先跳过。如果感兴趣，看懂专栏内容即可，不需要掌握代码实现

## 7.散列表

尽管散列表的内容我讲了很多，有三节课。但是，总体上来讲，这块内容理解起来并不难。但是，作为一种应用非常广泛的数据结构，你还是要掌握牢固散列表。

难易程度：Medium

是否重点：8分

掌握程度：对于初学者来说，自己能代码实现一个拉链法解决冲突的散列表即可

## 8.哈希算法

这部分纯粹是为了开拓思路，初学者可以略过。

难易程度：Easy

是否重点：3分

掌握程度：可以暂时不看

## 9.二叉树

这一部分非常重要！二叉树在面试中经常会被考到，所以要重点掌握。但是我这里说的二叉树，并不包含专栏中红黑树的内容。红黑树我们待会再讲。

难易程度：Medium

是否重点：9分

掌握程度：能代码实现二叉树的三种遍历算法、按层遍历、求高度等经典二叉树题目

## 10.红黑树

对于初学者来说，这一节课完全可以不看。

难易程度：Hard

是否重点：3分

掌握程度：初学者不用把时间浪费在上面

## 11. B+树

虽然B+树也算是比较高级的一种数据结构了，但是对初学者来说，也不是重点。有时候面试的时候还是会问的，所以这一部分内容，你能看懂专栏里的讲解就可以了。

难易程度：Medium

是否重点：5分

掌握程度：可看可不看

## 12.堆与堆排序

这一部分内容不是很难，初学者也是要掌握的。

难易程度：Medium

是否重点：8分

掌握程度：能代码实现堆、堆排序，并且掌握堆的三种应用（优先级队列、Top k、中位数）

## 13.图的表示

图的内容很多，但是初学者不需要掌握那么多。一般BAT等大厂面试，不怎么会面试有关图的内容，因为面试官可能也对这块不会很熟悉哈：）。但是，最基本图的概念、表示方法还是要掌握的。

难易程度：Easy

是否重点：8分

掌握程度：理解图的三种表示方法（邻接矩阵、邻接表、逆邻接表），能自己代码实现

## 14.深度广度优先搜索

这算是图上最基础的遍历或者说是搜索算法了，所以还是要掌握一下。这两种算法的原理都不难哈，但是代码实现并不简单，一个用到了队列，另一个用到了递归。对于初学者来说，看懂这两个代码实现就是一个挑战！可以等到其他更重要的内容都掌握之后，再来挑战，也是可以的。

难易程度：Hard

是否重点：8分

掌握程度：能代码实现广度优先、深度优先搜索算法

## 15.拓扑排序、最短路径、A*算法

这几个算法稍微高级点。如果你能轻松实现深度、广度优先搜索，那看懂这三个算法不成问题。不过，这三种算法不是重点。面试不会考的。

难易程度：Hard

是否重点：5分

掌握程度：有时间再看，暂时可以不看

## 16.字符串匹配（BF、RK）

BF非常简单，RK稍微复杂点，但都不难。这个最好还是掌握下。

难易程度：Easy

是否重点：7分

掌握程度：能实践BF算法，能看懂RK算法

## 17.字符串匹配（BM、KMP、AC自动机）

这三个算法都挺难的，对于算法有一定基础的人来说，看懂也不容易。所以，对于初学者来说，千万别浪费时间在这上面。即便有余力，看懂就好了，不用非得能自己实现。

难易程度：Hard

是否重点：3分

掌握程度：初学者不用把时间浪费在上面

## 18.字符串匹配（Trie）

这个还是要能看懂，不过不需要能代码实现。有些面试官喜欢考这个东西，主要是结合应用场景来考察，只是看你知不知道要用Trie树这个东西。

难易程度：Medium

是否重点：7分

掌握程度：能看懂，知道特点、应用场景即可，不要求代码实现

## 19.位图

位图不是重点，如果有余力最好掌握一下。

难易程度：Easy

是否重点：6分

掌握程度：看懂即可，能自己实现一个位图结构最好

## 20.四种算法思想

这个是重点，也是难点。贪心、分治、回溯、动态规划，每一个都不简单，其中动态规划又是最难、最烧脑的。要应付FLAG这样公司的面试，必须拿下这块内容。但是呢，学习要循序渐进，这块内容的学习可以放到最后，做个长时间的学习计划来攻克。

这块内容理论的东西不多，要想真的掌握，还是要大量刷题。

难易程度：Hard

是否重点：10分

掌握程度：可以放到最后，但是一定要掌握！做到能实现Leetcode上Medium难度的题目

学而时习之，专栏虽然已经结束，但是学习的同学和留言依旧源源不断。希望这份学习指导手册对你有帮助，也欢迎你继续给我留言，和大家一起交流、学习、进步。
