CategoryResourceRepost/极客时间专栏/数据结构与算法之美/加餐:不定期福利/《数据结构与算法之美》学习指导手册.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

226 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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难度的题目
学而时习之,专栏虽然已经结束,但是学习的同学和留言依旧源源不断。希望这份学习指导手册对你有帮助,也欢迎你继续给我留言,和大家一起交流、学习、进步。