为什么数据结构和算法如此重要?因为:程序 = 数据结构 + 算法
数据结构是一组数据的存储结构和组织方式,使得该组数据便于访问、修改、存储。
算法是操作数据的一组方法,解决问题的一系列步骤。
学习条件
- 必须要学过至少一门编程语言
- 需预留至少 2 个月的空余时间,急着找工作的同学可以先不学
知识
- 数据结构
- 线性结构
- 数组
- 字符串
- 链表
- 单向链表
- 双向链表
- 循环链表
- 栈
- 队列
- 普通队列
- 双端队列
- 数组
- 散列结构
- 集合
- 映射
- BitMap
- 树
- 二叉树
- 二叉查找树
- 多叉树
- 前缀树
- 堆
- 小顶堆
- 大顶堆
- 图
- 最短路径
- 并查集
- 最小生成树
- 拓扑排序
- 线性结构
- 算法
- 排序
- 冒泡排序
- 快速排序
- 插入排序
- 希尔排序
- 选择排序
- 堆排序
- 归并排序
- 计数排序
- 桶排序
- 基数排序
- 贪心
- 分治
- 动态规划
- 递归
- 回溯
- 枚举
- 查找
- 有序表查找
- 二分查找
- 线性表查找
- 树结构查找
- 散列表查找
- 有序表查找
- 搜索
- 深度优先搜索 DFS
- 广度优先搜索 BFS
- 字符串匹配
- KMP
- 前缀树
- 位运算
- 排序
- 复杂度分析
- 时间复杂度
- 空间复杂度
学习路线
本学习路线适用于所有从 0 开始学算法的同学,但如果是要搞 ACM 算法竞赛的话,只学这些是远远不够的哦。
预热
该阶段可跳过,或者与之后的阶段同时进行
初学编程、刚开始学习算法时,可以先通过阅读课外书、科普视频来培养兴趣,简单地入门,而不要求真正的理解。
推荐阅读《漫画算法:小灰的算法之旅》 ,轻松幽默。
依次学习
了解每个数据结构和算法的概念、特点、适用场景、时空复杂度,并且能够自己写代码从 0 到 1 实现一遍每个数据结构和算法。注意要按顺序学习,而不是一次性看完所有的数据结构和算法后才再回过头来写代码!
要重点学的知识点基本就是大纲中提到的那些,图论这一块了解即可,优先级不高,面试考的也不多。链表、树是面试重点。
推荐直接从 LeetCode 的学习板块 LeetBook 开始刷起,边学边写代码,学的更扎实。
可以按照如下顺序学习:
- 算法基础理论和复杂度分析:https://www.bilibili.com/video/BV1nJ411V7bd (看前几节就可以了,后面可以配合着LeetCode 去看,依次攻克每个知识点)
- 数组和字符串:https://leetcode-cn.com/leetbook/detail/array-and-string/
- 链表:https://leetcode-cn.com/leetbook/detail/linked-list/
- 队列 & 栈:https://leetcode-cn.com/leetbook/detail/queue-stack/
- 哈希表:https://leetcode-cn.com/leetbook/detail/hash-table/
- 查找表类算法:https://leetcode-cn.com/leetbook/detail/all-about-lockup-table/
- 二分查找:https://leetcode-cn.com/leetbook/detail/binary-search/
- 二叉树:https://leetcode-cn.com/leetbook/detail/data-structure-binary-tree/
- 二叉搜索树:https://leetcode-cn.com/leetbook/detail/introduction-to-data-structure-binary-search-tree/
- 前缀树:https://leetcode-cn.com/leetbook/detail/trie/
- N 叉树:https://leetcode-cn.com/leetbook/detail/n-ary-tree/
- 数组类算法:https://leetcode-cn.com/leetbook/detail/all-about-array/
- 初级算法:https://leetcode-cn.com/leetbook/detail/top-interview-questions-easy/
- 中级算法:https://leetcode-cn.com/leetbook/detail/top-interview-questions-medium/
完整教程:
- 数据结构与算法基础(青岛大学-王卓):https://www.bilibili.com/video/BV1nJ411V7bd
- 尚硅谷 Java 数据结构与算法(视频):https://www.bilibili.com/video/BV1E4411H73v (难度和涉及的知识点比面试的要求大一些,初次学习不建议看 ,适合时间充裕、希望更全面学习的朋友来查漏补缺)
- 《算法图解》书籍:https://www.aliyundrive.com/s/MFSC8TP7ANB 提取码: 73dl
- 《大话数据结构》书籍:https://www.aliyundrive.com/s/MFSC8TP7ANB 提取码: 73dl
- 还有一些不同语言的数据结构与算法教程,可以在 知识库 – 资源汇总 里搜索和获取。
一些辅助学习的工具:
- VisuAlgo 数据结构和算法动态可视化:https://visualgo.net/zh
- 数据结构可视化:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
- RegExr:https://www.code-nav.cn/rd/?rid=79550af2601114e9012110711798772b (学习、创建和测试正则表达式的在线可视化工具)
依次练习
学完某个数据结构和算法后,立刻趁热打铁去做几道相关的题目。
每道题目给自己一个时间限制,超出时间后就直接去阅读题解(建议看带有图片和动画演示的题解),有一些思路后再试着自己去做题,直到把题目完成写出,并且要真正理解每道题目的解法。
即使是自己做出的题目,也建议去看下其他同学的题解,多积累一种方法。
刷题
当把每个知识点学完一遍后,可以去 LeetCode 网站的题库中刷题,按照难易度、通过率、热门程度每天坚持刷几道。时间紧张(三个月内)的话也可以直接去刷热门题目集合。
有时间的话,建议大家可以参加 蓝桥杯竞赛 、考 PAT 认证,检验自己的学习、丰富自己的简历。
相关资源:
- 算法刷题网站
- LeetCode 精选 100 道:https://leetcode-cn.com/problem-list/2cktkvj/
- LeetCode 精选算法 200 题:https://leetcode-cn.com/problem-list/qg88wci/
- LeetCode 算法高频面试题汇总:https://leetcode-cn.com/leetbook/detail/top-interview-questions/
面试前
在面试前,建议刷一遍 LeetCode 热门题目,有时间的话还可以阅读《剑指 Offer》、《剑指 Offer 专项突破版》、《程序员代码面试指南》等书籍,争取面试时撞到原题。
几份完整的题解,有空的话挑一份看即可:
- 图解算法数据结构:https://leetcode-cn.com/leetbook/detail/illustration-of-algorithm/
- Leetcode 真题解析视频:https://www.bilibili.com/video/BV1a54y1b74k
- LeetCode 101(C++):https://github.com/changgyhub/leetcode_101
- LeetCode 题解(C++):https://github.com/soulmachine/leetcode
- LeetCode Cookbook(Go 语言):https://github.com/halfrost/LeetCode-Go
如果有意向公司(比如大厂)的话,可以去刷一下 历年笔试题目 (难度可能比较大,不要因此丧失信心,多练习后就习惯了)。
工作后
工作之后,如果有兴趣的话,可以通过刷题来帮助自己巩固编程语言、提升思维能力。
学习建议
- 数据结构和算法不可追求速成(学得快忘得快),而是应该每天坚持刷 2 道以上的题目保持手感。(可以在星球中打卡分享自己每天所刷的题目,也许会有小伙伴和你一起讨论哦)
- 自己在写算法题目时,要给代码多写一些注释,记录自己当时的思考,并且做过的每道算法题目的代码都要分类保存好,便于自己复习。
- 可以根据实际情况自己写一些题解,写题解的过程中,不仅能检验自己是否真的理解,还能再次巩固、帮助自己复习。
- 算法是一种思想,用任何你正在学习或者熟悉的编程语言来写代码均可,可以帮助你复习编程语言的语法和细节。
- 不用因为担心自己算法不够而不敢面试,只要你有了基本的开发技能就足够了,算法可以持续强化。
- 很多同学可能会习惯性地刷自己觉得很简单的题目,而对于中等 / 困难的题目有恐惧感,下意识地回避。这在刚开始入门时没什么问题,但如果已经刷了几百题,不要满足于自己会的知识,要适当挑战,走出舒适圈。
- 有时间的朋友也可以试着参与各种算法竞赛和考证书,比如蓝桥杯、PAT 认证、LeetCode 周赛等。这些比赛没什么门槛,难度也没有 ACM 那么高。可以帮助你集中精神高效做题、提前适应面试的节奏感。





