- 课程目录
- 课程介绍
-
在线阅读:开篇词|学习数据结构与算法,也可以是件小事
日拱一卒,功不唐捐。这是我非常喜欢的一句话,这里也送给即将踏上旅程的你。
-
01|编程环境:工欲善其事,必先利其器
俗话说,“工欲善其事,必先利其器”,今天我们就来说说编程环境的搭建。
-
02|顺序表(上):如何实现快速地随机访问?
在聊顺序表之前,首先我们要引入“线性结构”和“线性表”的概念。
-
03|顺序表(下):常用操作合集与复杂度分析
这节课,我们继续探讨顺序表的不同操作,和上节课一样,先从抽象模型开始理解,再去理解操作的实现的代码。通过时间复杂度的分析,为我们提供优化操作的思路。
-
04|单链表:如何通过指针提升插入、删除数据的速度?
线性表的链式存储也非常基础和常用,它不需要使用连续的内存空间。
-
05|双链表:搜索链表中节点的速度还可以更快吗?
这一系列的讲解,都是为了让我们更了解双链表的工作原理。除非有特殊需要,一般不需要自己实现单链表和双链表,因为标准模板库中已经提供了。
-
06|循环链表:如何更方便地寻找数据?
为什么一定要在单链表或者双链表基础上引入循环链表呢?
-
07|静态链表:用一维数组表达的链表
有些早期的高级语言,并没有指针这种概念,之前我们探讨的链表实现方法在这些高级语言中并不适用。于是,静态链表应运而生。
-
08|栈:如何实现数据的后进先出?
通常来说,我们可以把栈理解为一种受限的线性表。
-
09|队列:如何实现数据的先进先出?
对于许多服务资源有限的场合,都可以通过队列来实现对服务请求的排队。
-
10|二叉树:二叉树到底长什么样子?
二叉树的性质对于后面编写程序时决定内存空间分配多少、二叉树的高度和节点数量如何计算以及如何寻找某个节点的父或子节点等都具有重要的指导意义
-
11|二叉树:深度优先和广度优先遍历是什么?
深度优先遍历和广度优先遍历,请你注意这两个概念的区别。
-
12|二叉树:如何存储二叉树?
这节课,我们学习二叉树的两种存储方式——顺序存储方式、链式存储方式,以及他们的实现方式。
-
13|线索二叉树:如何线索化二叉树以提升访问速度?
线索二叉树,其实就是加上了线索的二叉树,而线索,也就是指向前趋或后继节点的指针。
-
14|二叉查找树(BST):查找速度你最行
二叉查找树也叫二叉搜索树,存在的意义在于实现快速查找,同时,它也支持快速插入和删除。
-
15|平衡二叉树(AVL):平衡如此重要,怎么做到的?
平衡二叉树作为后续红黑树学习的铺垫,很容易被人忽略。
-
16|平衡二叉树(AVL):节点删除后的平衡性调整
平衡二叉树删除某个节点的操作与二叉查找树删除某个节点的操作非常类似,但删除操作同样会使平衡二叉树失去平衡性。
-
17|红黑(R-B)树:和平衡二叉树有什么不同?
在频繁进行插入和删除操作的场合,红黑树比平衡二叉树具有更高的效率。
-
18|红黑(R-B)树:节点插入后的平衡性调整
如果要进行“向红黑树插入节点”的操作,这个操作会分为两种情况:没有任何节点的空树以及非空的树。
-
19|红黑(R-B)树:节点删除后的平衡性调整(一)
这次我将继续和你分享另一个重要的话题——从红黑树中删除一个节点后的平衡性调整。
-
20|红黑(R-B)树:节点删除后的平衡性调整(二)
这节课我们接着讨论删除黑色叶子节点导致的红黑树平衡行调整问题。
-
21|哈夫曼(Huffman)树:将数据压缩后再传输更省带宽
哈夫曼树是用来创建哈夫曼编码的。哈夫曼编码是一种可以用于数据压缩的编码方式,哈夫曼编码的构造过程需要用到哈夫曼树。
-
22|树、森林、二叉树:相互之间的转换
这节课要好好掌握树、森林与二叉树之间的相互转换。这样即便面对各种各样的题目,都会比较容易想出答案。
-
23|图:如何用图表达错综复杂的数据?
你能想到的图的应用有哪些呢?
-
24|图的存储(上):邻接矩阵、邻接表和十字链表有什么不同?
本节我们会学习可以用哪些数据结构来存储图,包括邻接矩阵、邻接表以及十字链表。
-
25|图的存储(下):为什么我们还需要邻接多重表和边集数组?
这节课,我带你学习另外两种图的存储结构,分别是邻接多重表和边集数组。
-
26|图:深度优先遍历(DFS)与广度优先遍历(BFS)
图的深度优先遍历,也就是选择任意一条路走进去,一直到发现走不通的时候退回到上一个岔路口并重新选择一条路走进去,直到走遍所有关键节点。那图的广度优先遍历呢?
-
27|最小生成树:如何用普里姆(Prim)算法解决修路费用最少的问题?
最小生成树对于解决在多个城市之间如何修路所花费的资金最少等问题具有非常现实的意义。
-
28|最小生成树:克鲁斯卡尔(Kruskal)算法与修路费用最少的问题?
现实生活中有哪些问题比较适合用克鲁斯卡尔算法实现的最小生成树来解决?
-
29|最短路径:迪杰斯特拉(Dijkstra)算法与选择最节省时间的行走路线问题
仔细想想还有哪些实际生活中的问题可以 用迪杰斯特拉算法解决呢?
-
30|最短路径:弗洛伊德(Floyd)算法与乘车费用最少的问题
请你想一想,日常生活中的哪些问题可以采用弗洛伊德算法来解决呢?
-
31|图的应用:如何通过拓扑排序找到合理的先后顺序?
我们可以把做一盘番茄炒蛋菜看成一个工程,以做菜过程中经历的各个步骤作为顶点,以各种步骤之间的关系作为弧建立起一个有向无环图。
-
32|图的应用:如何通过关键路径估算完成工程需要的最短时间?
你能仿照本节所讲述的做一盘番茄炒蛋菜的工程来规划一个新的工程,绘制出该工程所代表的AOE网并求出该AOE网对应的关键路径信息吗?
-
33|直接插入排序:为什么数据越有序,排序速度越快?
从这节课开始,我会带你学习各种排序算法,今天我们主要说的就是插入类排序算法中的直接插入排序算法。
-
34|希尔排序:通过部分有序逼近全局有序
可以说,希尔排序算法是对直接插入排序算法的改进,它先追求元素的部分有序,然后再逐渐逼近全局有序。
-
35|冒泡排序:大数下沉,小数上浮
所谓交换类排序,就是根据序列中两个关键字的比较结果,来决定是否要交换这两个关键字对应的记录在序列中的位置。
-
36|快速排序:如何通过基准元素改进冒泡排序?
如何通过基准元素改进冒泡排序?
-
37|简单选择排序与堆排序:多趟排序与利用有序完全二叉树进行排序
在堆排序算法中,若要对一个有10个元素的数组进行排序,最多需要进行多少次比较和数值交换操作?
-
38|归并排序:将多个有序序列按其中的元素值大小两两合并
与选择类排序算法相比,归并排序算法在实现方式、时间复杂度、稳定性方面皆有不同,所以建议你在学习的时候注意比较。
-
39|串的顺序和链式存储结构:定长数组与动态数组
串的链式存储不具备串的顺序存储中的随机存取特性,所以它的实用性其实是不如串的顺序存储的。
-
40|串的朴素模式匹配算法:暴力但容易理解
你可以试着用串的朴素模式匹配算法实现这个问题:给定一个主串和一个子串,找出主串中所有与子串匹配的位置。
-
41|串的KMP模式匹配算法观察:理解困难
上节课我带你学习了串的朴素模式匹配算法,这种算法思想简单,执行效率不高。为什么这么说呢?我带你仔细分析一下。
-
42|串的KMP模式匹配算法之实现与性能分析:代码实现简单
KMP模式匹配算法的使用也有其制约性,也就是如果在字符串匹配过程中不经常出现子串中的部分内容与主串匹配的情形,那么与串的朴素模式匹配算法相比,串的KMP模式匹配算法的优势就不太明显。
-
43|串的KMP模式匹配算法之改进:通过优化代码解决多次重复比较问题
这节课我们会详细讨论通过next数组来求解nextval数组,并解释之所以这样求解nextval数组的原理,相信对你理解算法的改进思路有着不小的帮助。
-
44|跳表:为什么Redis用跳表实现而MySQL用B+树?
一句话总结,就是为了有效减少磁盘操作次数,从而提升数据查询效率
-
45|哈希表与哈希算法:哈希表适合用在什么样的情景?
哈希函数的设计方法有很多,我们重点谈到了直接定址法、除留余数法、数字分析法、平方取中法、折叠法。
-
46|哈希表与哈希算法:字符串的MD5值是通过哈希算法得到的?
哈希算法的应用领域很广,除了在哈希函数中使用来计算哈希值外,还可以应用在安全加密领域、唯一标识领域以及数据校验领域等。
-
47|多路查找树:B树在数据库中的应用
11
-
48|多路查找树:B+树的插入与删除操作详解
从代码实现的角度来讲,B+树的删除代码与B树大同小异但要稍微复杂一点。要注意非叶子节点中也存在要删除或者替换的数据。
-
49|多路查找树:B树、B+树在数据库中的应用有何不同?
B树和B+树的优缺点分别是什么?你是否想过,是否可以对B+树的性能进行进一步优化,可以从哪些方面入手?
-
50|折半插入、2路插入、表插入:3种插入类排序类排序有哪些异同?
它们的共同点是将待排序元素逐个插入到已经排好序的序列中,差别在于寻找插入位置的方法不同并且使用不同的数据结构来存储已经排好序的序列。
-
51|树形选择排序:按照锦标赛的思想进行排序
树形选择排序的每一趟排序都会减少需要两两比较的元素数量,从而达到了节省时间提高效率的目的,这就是树形选择排序相较于简单选择排序一个重大的改进之处。
-
52|计数排序:不通过比较也可以进行排序
计数排序是通过计数而非比较来进行排序的。算法比较简单,适合于待排序记录数量多,但排序关键字的范围比较小的整数数字排序情形。
-
53|基数排序与桶排序:如何通过分配和收集进行排序?
基数排序不需要进行关键字的比较,但需要进行多趟排序。桶排序适合要排序的数据分布比较均匀时采用。
-
结束语|日拱一卒,功不唐捐
如果有一天你成长为技术领域的专家,而恰好我们在这门课中同行过一段时间,那我的目标也就达成了。祝你工作顺利,我们江湖再见!
课程介绍
限时福利 你将获得 40+ 经典数据结构与算法一网打尽 “保姆级”代码实现与图示详解 聚焦 60+ 算法高频面试题目 从 0 到 1 算法优化逻辑精讲 讲师介绍 “C++ 新经典”系列书籍《C++ 新经典》《C++...限时福利
你将获得
- 40+ 经典数据结构与算法一网打尽
- “保姆级”代码实现与图示详解
- 聚焦 60+ 算法高频面试题目
- 从 0 到 1 算法优化逻辑精讲
讲师介绍
“C++ 新经典”系列书籍《C++ 新经典》《C++ 新经典:对象模型》《C++ 新经典:Linux C++ 通信架构》《C++ 新经典:模板与泛型编程》《C++ 新经典:设计模式》作者。拥有多年授课经验,讲课风格深入浅出。
也曾参与创办深圳知名网络安全公司安络科技有限公司,是公司的网络安全在线扫描评估系统项目负责人,全球同服独立游戏《冒险之路》制作人。
课程介绍
提到数据结构与算法,“吃透”和“内功”这两个词像两座大山一样压在身上,让人喘不过气,以至于出现了很多所谓的坚持和抱怨。但是,作为一门计算机专业的基础课程,它也的确是我们学习之路上绕不开的伙伴。
要想进入大厂,它是许多求职者的敲门砖;想要深入了解热门技术,比如微服务、大数据、云计算等等,它也是必备的基础知识。
然而我们发现,涉及数据结构和算法知识方面的资料多数比较晦涩,不是数学知识过多,就是学术性太强。有些资料知识覆盖面太过宽泛甚至表达不清,导致学习者一头雾水,所提供的实现代码也往往是伪码或代码片段,很难让人有舒适的学习体验。
为此,我们邀请到了《C++ 新经典》系列作者,资深 C++ 讲师王健伟,帮你抛下身上对于数据结构与算法的沉重包袱,回归最基础的概念与代码,夯实基础、打开思路,潜移默化地培养数据结构与算法的敏感度,更为之后的每一次实战打下坚实的基础。
课程模块设计
本专栏分为3个由浅入深的大模块。

预习模块
到底什么是数据结构与算法?为什么编程环境还会是我们的绊脚石?这一模块将为你打开数据结构与算法的大门,扫清所有非知识性的障碍,同时,也将回到具体的代码实现上,为你建立算法的时间复杂度和空间复杂度的意识,为后面的学习打好基础。
基础模块
这个模块包括线性表、树、图、排序、字符串、跳表与哈希表等等面试或应用当中遇到的大部分数据结构与算法。课程会先详细呈现一个数据结构或一个算法的概念和思路,充分理解后,再将思路通过代码的方式实现出来,整个过程会更顺理成章。同时,也避免了在学习的初级阶段就接触过多抽象思维,删繁就简,易懂性强。
进阶篇
这个模块包含一些难度相对较大,在面试中出现频率没那么高的内容,比如 B+ 树、折半插入排序、计数排序、基数排序及桶排序等等。少花一点精力,少敲一些代码,把课程中讲解的内容理解就完全没问题了。
课程目录

适合人群
难度定位:初等难度。
适合人群:初学者,以及基础较为薄弱的C++工程师。
- 对于初学者,是必看的极简学习攻略。
- 对于从事 C++ 开发 3-5 年的同学,是进一步提升之前需要回归的基础内容,需要落实在代码层面,进一步精、准、熟练掌握。