image.png

什么是算法?什么是数据结构?

从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。
从狭义上讲,是指某些著名的数据结构(队列、栈、堆)和算法(二分查找、动态规划)。
数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。 因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。

最常用的、最基础数据结构与算法

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。

    学习路线image.png

    image.png

    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 难度的题目