最值得收藏的数据结构与算法学习路线

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介: 数据结构与算法学习路线

说出来还真有点不好意思。上学那时候傻,为了校招,硬着头皮刷《算法导论》、《编程珠玑》,还有 LeetCode,刷了小一年。

等找到了工作后才恍然大悟,原来当初根本不用那么辛苦。这不,刚好有小伙伴在《二哥的Java进阶之路》知识星球上问我算法的学习路线,我就毫不保留地把我算法方面的学习经验分享出来,希望能给大家一点点启发和帮助。

我画了一张图,里面几乎涵盖了所有数据结构与算法书籍中都会讲到的知识点。

但讲良心话,对于一个初学者,或者不打算卷算法岗的程序员来说,完全就没必要把思维导图里面的所有知识点都学了,那样就太不高效了。

我们学习数据结构与算法,也得讲究策略。我的建议是这样的(敲黑板、划重点了啊):

7 个数据结构:

数组
链表

队列
哈希表
二叉树

10 个算法:

递归
排序
二分查找
搜索
哈希算法
贪心算法
分治算法
回溯算法
动态规划
字符串匹配算法
这些是学习数据结构与算法时的重点。很多人在第一次接触数据结构与算法这门课时,往往会觉得很抽象,很难搞懂,以至于站在门外徘徊不前。

其实真正的原因是没有找到好的学习方法,没有抓住学习的重点。相信你认真看完我这条学习路线后,学起来就会有的放矢、事半功倍了。

一、什么是数据结构

数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。例如,计算机网络依赖于路由表运作,B 树高度适用于数据库的封装。

简单点说,数据结构就是把一堆数据,按照某种格式揉成一坨。

大家喜欢吃宫保鸡丁吗?

反正二哥挺喜欢这道菜的。我就以宫保鸡丁为例,来讲一讲数据结构吧。维基百科上是这样定义的。

宫保鸡丁(英语:Kung Pao chicken或Kung-Pao Chicken),又称宫爆鸡丁,呈糊辣荔枝味,源于黔菜、流传至鲁而后成于川菜的一道川味名菜。贵州、山东和四川三地对这道菜的做法不完全一样,称呼也有差异。贵州称为糊辣子鸡丁,山东则名为酱爆鸡丁,而四川是以宫保鸡丁为名的。

来,抽象下宫保鸡丁。

struct KungPaoChicken {
鸡肉 = []
花生 = []
葱段 = []
花椒 = []
辣椒 = []
}
这个结构体(struct 是 C 语言中的一个概念)就是一个自定义的数据结构,将很多不同的配料融合在了一起。对于计算机的数据结构来说,只不过是把这些配料换成了基本数据类型。

抽象完宫保鸡丁再来抽象一下二哥吧。

class 二哥 {
int age = 18;
double 体重 = 65kg;

void eat(宫保鸡丁) {
体重 += 1kg;
}
}
伪代码不是很严谨哈,大家理解这个意思就行了。

说到底,数据结构不过是一种抽象后的封装。像 Java,它之所以流行的一个很重要的原因,就是它提供了多种多样的、方便开发者调用的数据结构,比如说对数组的封装 ArrayList、对链表的封装 LinkedList、对哈希表的封装 HashMap、ConcurrentHashMap 等等。C 语言就没有这些,想用的话,就得自己封装。但 Java 和 C 语言的基本数据类型是一致的,int、float 这些都是相通的。

对于初学者来说,平常敲代码都是直接去调用数据结构的,是很少去想这些数据结构是怎么实现的。

当一个初学者向高级程序员迈进的时候,就必须得静下心来,去搞清楚 ArrayList 和 LinkedList 的内部实现,搞清楚之后就会明白,之所以它们在增删改查的时候性能上有差异,就是因为它们的内部使用了不同的数据结构所导致的。

经典的数据结构与算法都有哪些呢?比如说队列、栈、堆、二分查找、动态规划等等。

二、什么是算法

算法就是操作数据的一组方法。数据结构是为算法服务的,而算法想要体现出自己的价值,就必须得有数据结构这个载体。

它们俩就好像是一对恋人,离开了谁,都会孤单寂寞冷。

那一些初学者可能会有这样的疑惑:我数学成绩一般,学数据结构与算法会很吃力吗?

当然了,数据结构和算法离不开一些数学方面的推理和证明,比如说我们在分析某个算法的时间复杂度和空间复杂度时。但这个不需要去担心,只要你能保持高中时期的数学水准,就完全可以学好数据结构与算法。

三、为什么要学习数据结构和算法

你是不是觉得数据结构与算法,跟操作系统、计算机网络一样,都是脱离实际工作的知识,可能除了面试,这辈子都用不着?

就算不懂数据结构与算法,照样可以把 Java API、开发框架用得飞起?

首先,面试的确是要考数据结构与算法的。这是很多大厂的筛选要素之一。

这是因为校招的时候,参加面试的学生大多数都是没有实际项目经验的,公司只能通过考察这些基础知识来筛选。

大厂不怕你没有项目经验,而怕你没有长期发展的潜力。

所以,很多参加校招的同学,在面试前都会疯狂刷题的,至少会突击个 100 道左右的题目。

其次,实际工作当中肯定是会用到的。

举个例子,存储某个业务数据时,你打算用 ArrayList 还是 LinkedList,它们底层用的是哪种数据结构,增删改查上有哪些优缺点?

再比如,Redis 中的有序集合是用什么数据结构实现的?为什么要用跳表二不是二叉树呢?

不懂数据结构和算法,行得通吗?

还有,掌握了数据结构与算法,对阅读源码会有很大的帮助,因为很多时候,源码当中都会考量到不同数据结构之间的优点和缺点。

你比如说,HashMap 为什么在链表长度大于 8 的时候将其转为红黑树?为什么不能是二叉树?

总结一下。

我们学习数据结构与算法,并不是为了死记硬背几个知识点,我们的目的是建立时间复杂度、空间复杂度的意识,写出高质量的代码,提升编程技能,训练逻辑思维,从而获得更高的薪资回报。

为什么要学习数据结构与算法,我认为 3 点很重要:

1、写出性能更佳的代码。
2、算法是求解问题的计算步骤,而程序是用计算机可以理解的语言来描述的算法。
3、长期来看,思考能力是一个人非常重要的核心竞争力,而算法是为数不多能训练思考能力的途径之一。

是时候提升自己的内功了,这样怼人也会更自信,跳槽也不用畏畏缩缩了。

四、硬核算法和数据结构学习资料

1)视频

B 站上浙江大学的一个数据结构课非常不错,很系统很经典。每次看这些大学老师的讲课就越觉得考好大学很重要,很多学校的老师,在讲数据结构和算法的时候,自己都不知道自己在讲什么。

不得不说,陈越姥姥等人对数据结构和算法这个领域的知识理解是真的透彻,我在听这个课的时候感觉整个人都通透了。

视频地址:https://www.bilibili.com/video/BV1Kb41127fT

这里还有个同学在 GitHub 上整理这门课程的所有课件和作业,学习 Java 的小伙伴可以尝试用 Java 完成下作业。

GitHub 地址:https://github.com/CYBruce/DataStructure_Algorithm_ZJU

#2)书籍
入门阶段推荐陈小玉老师的《趣学数据结构》和《趣学算法》。

算法领域的经典参考书《算法 4》也非常值得推荐,里面的代码是用 Java 实现的,所以 Java 开发者可以直接选用这本书。

学霸型人才可以直接刷《算法导论》,严谨全面,可以直接拿来作为研究生阶段的算法课程教材。

#3)开源电子书
算法方面的开源电子书是真的非常多,这里推荐下《labuladong 的算法小抄》,仓库里面有句话我非常认同——“刷题刷题,刷的是题,培养的是思维”,这个仓库的优势就在于,它的解题思路很完备,我相信可以帮助到不少读者,至少在刷题的时候少走很多弯路。

目录
相关文章
|
存储 算法 C语言
复习【数据结构与算法】
复习【数据结构与算法】
132 0
|
7月前
|
存储 算法 NoSQL
1.数据结构与算法开篇
1.数据结构与算法开篇
64 0
|
4月前
|
Java 程序员 C++
C++学习路线分享
C++学习路线分享
|
5月前
|
存储 机器学习/深度学习 算法
数据结构与算法基础知识
数据结构与算法基础知识
30 0
|
7月前
|
存储 算法 C++
【C++ 数据结构与算法 一站式备考指南】一文掌握 数据结构与算法课程 知识点(一)
【C++ 数据结构与算法 一站式备考指南】一文掌握 数据结构与算法课程 知识点
262 2
|
7月前
|
存储 算法 搜索推荐
【C++ 数据结构与算法 一站式备考指南】一文掌握 数据结构与算法课程 知识点(二)
【C++ 数据结构与算法 一站式备考指南】一文掌握 数据结构与算法课程 知识点
157 2
|
7月前
|
存储 人工智能 算法
有哪些数据结构与算法是程序员必须要掌握的?——“数据结构与算法”
有哪些数据结构与算法是程序员必须要掌握的?——“数据结构与算法”
|
7月前
|
存储 算法 Java
数据结构与算法笔记(一)
数据结构与算法笔记(一)
123 0
|
存储 机器学习/深度学习 算法
数据结构与算法的学习笔记
在学习数据结构的时候的一些个人的学习笔记