你会学到什么?
- 40+ 经典数据结构与算法一网打尽
- “保姆级”代码实现与图示详解
- 聚焦 60+ 算法高频面试题目
- 从 0 到 1 算法优化逻辑精讲
课程简介
提到数据结构与算法,“吃透”和“内功”这两个词像两座大山一样压在身上,让人喘不过气,以至于出现了很多所谓的坚持和抱怨。但是,作为一门计算机专业的基础课程,它也的确是我们学习之路上绕不开的伙伴。
要想进入大厂,它是许多求职者的敲门砖;想要深入了解热门技术,比如微服务、大数据、云计算等等,它也是必备的基础知识。
然而我们发现,涉及数据结构和算法知识方面的资料多数比较晦涩,不是数学知识过多,就是学术性太强。有些资料知识覆盖面太过宽泛甚至表达不清,导致学习者一头雾水,所提供的实现代码也往往是伪码或代码片段,很难让人有舒适的学习体验。
为此,我们邀请到了《C++ 新经典》系列作者,资深 C++ 讲师王健伟,帮你抛下身上对于数据结构与算法的沉重包袱,回归最基础的概念与代码,夯实基础、打开思路,潜移默化地培养数据结构与算法的敏感度,更为之后的每一次实战打下坚实的基础。
课程模块设计
本专栏分为 3 个由浅入深的大模块。
预习模块
到底什么是数据结构与算法?为什么编程环境还会是我们的绊脚石?这一模块将为你打开数据结构与算法的大门,扫清所有非知识性的障碍,同时,也将回到具体的代码实现上,为你建立算法的时间复杂度和空间复杂度的意识,为后面的学习打好基础。
基础模块
这个模块包括线性表、树、图、排序、字符串、跳表与哈希表等等面试或应用当中遇到的大部分数据结构与算法。课程会先详细呈现一个数据结构或一个算法的概念和思路,充分理解后,再将思路通过代码的方式实现出来,整个过程会更顺理成章。同时,也避免了在学习的初级阶段就接触过多抽象思维,删繁就简,易懂性强。
进阶篇
这个模块包含一些难度相对较大,在面试中出现频率没那么高的内容,比如 B+ 树、折半插入排序、计数排序、基数排序及桶排序等等。少花一点精力,少敲一些代码,把课程中讲解的内容理解就完全没问题了。
课程目录
开篇词|学习数据结构与算法,也可以是件小事
预习篇
01 算法时间复杂度:千里之行,始于足下
02 算法空间复杂度:算法运行所需要的额外空间是多大?
03 编程环境:工欲善其事,必先利其器
线性表
04 顺序表(上):如何实现快速地随机访问?
05 顺序表(下):常用操作合集与复杂度分析
06 单链表:如何通过指针提升插入、删除数据的速度?
07 双链表:搜索链表中节点的速度还可以更快吗?
08 循环链表:如何更方便地寻找数据?
09 静态链表:如何用一维数组表达链表?
10 栈:如何实现数据的后进先出?
11 队列:如何实现数据的先进先出?
树形结构
12 二叉树(一):二叉树到底长什么样子?
13 二叉树(二):深度优先遍历与广度优先遍历
14 二叉树(三):如何存储一棵二叉树?
15 线索二叉树:如何线索化二叉树以提升访问速度?
16 二叉查找树(BST):查找速度你最行
17 平衡二叉树(AVL):平衡如此重要!怎么做到的?
18 平衡二叉树(AVL):如何完成节点删除后的平衡性调整?
19 红黑(R-B)树:和平衡二叉树有什么不同?
20 红黑(R-B)树:如何解决新节点插入导致的失衡难题?
21 红黑(R-B)树:如何解决新节点删除导致的失衡难题?
22 哈夫曼(huffman)树:数据压缩后再传输,更省带宽!
23 树、森林、二叉树相互之间的转换
图
24 图:如何用图表达错综复杂的数据?
25 图的存储(上):邻接矩阵、邻接表和十字链表有什么不同?
26 图的存储(下):为什么我们还需要邻接多重表和边集数组?
27 图:深度优先遍历(DFS)与广度优先遍历(BFS)
28 最小生成树:普里姆(prim)算法与修路费用最少的问题
29 最小生成树:克鲁斯卡尔(kruskal)算法与修路费用最少的问题
30 最短路径:迪杰斯特拉(dijkstra)算法与选择最节省时间的行走路线问题
31 最短路径:弗洛伊德(floyd)算法与乘车费用最少的问题
32 图的应用:如何通过拓扑排序找到合理的先后顺序?
33 图的应用:如何通过关键路径估算完成工程需要的最短时间?
排序
34 直接插入排序:为什么数据越有序,排序速度越快?
35 希尔排序:通过部分有序逼近全局有序
36 冒泡排序:大数下沉,小数上浮
37 快速排序:如何通过基准元素改进冒泡排序?
38 简单选择排序:多趟排序,多次选择
39 堆排序:如何利用有序的完全二叉树进行排序?
40 归并排序:将多个有序序列按其中的元素值大小两两合并字符串
41 串的顺序和链式存储结构:定长数组与动态数组
42 串的朴素模式匹配算法:暴力但理解容易
43 串的 KMP模式匹配算法观察:理解困难
44 串的KMP模式匹配算法之实现与性能分析:代码实现简单
45 串的KMP模式匹配算法之改进:如何通过优化代码解决多次重复比较问题?
跳表与哈希表
46 跳表:为什么redis用跳表实现而mYSQL用 B+树?哈希表与哈希算法:字符串的MD5值就是通过哈希算法得到的?
进阶篇
48 多路查找树:B树、B+树、B+树在数据库中的应用(上)
49 多路查找树:B 树、B+树、B+树在数据库中的应用(下)
50 折半插入排序:如何通过折半查找加速待排元素的位置确定?
51 2路插入排序:空间换时间,减少排序过程中记录的移动次数
52 表插入排序:不移动记录也可以排序?
53 树形选择排序:按照锦标赛的思想进行排序
54 计数排序:不通过比较也可以进行排序
55 基数排序及桶排序:如何通过分配和收集进行排序?
结束语日拱一卒,功不唐捐
讲师介绍
王健伟,1995 年毕业于哈尔滨工程大学计算机及其应用专业,从业软件开发 20 余年。主攻 C++ 语言,经历过数十个软件项目,主要涉及电信、网络安全、网络游戏等开发领域,具备深厚的软件开发实战经验。
“C++ 新经典”系列书籍《C++ 新经典》《C++ 新经典:对象模型》《C++ 新经典:Linux C++ 通信架构》《C++ 新经典:模板与泛型编程》《C++ 新经典:设计模式》作者。拥有多年授课经验,讲课风格深入浅出。
也曾参与创办深圳知名网络安全公司安络科技有限公司,是公司的网络安全在线扫描评估系统项目负责人,全球同服独立游戏《冒险之路》制作人。