大家都知道老师写过5本《C++新经典》系列书籍以及3本《信息学奥赛》系列书籍,分别在2020~2022年以及在2026年由清华大学出版社和北京大学出版社出版。但很少有人知道老师还写过一本《C++新经典:数据结构与算法》书。这本书原计划也是由清华大学出版社出版,但因为我自己当时的一些考虑,就没有交给清华社出版。
而如今,时过境迁,出版书籍的环境与前些年大不相同,书籍版号紧缩、出版社编辑专业知识和眼光所限、人们购买纸质书籍的习惯和欲望变低、人工智能的高速发展等原因,出版一本书籍的难度剧增。绝大部分出版社要求作者要有各平台的自媒体账号和相当数量的粉丝以保证书籍出版后作者能够在相当程度上帮助促进书籍的销售。所以我虽然有极大的创作热情(希望给后辈们留下一些核心知识帮助大家快速提升)和一定的书籍写作实力,但由于上述这些原因,不可避免的在书籍出版上减产甚至不再写作,大家且学且珍惜。
讲实话,从2018年开始,在讲课传播知识这个领域我耕耘了8年,在大型知名出版社出版了8本书,我自认为是有讲课天赋的,为了写这些书,我看过太多人讲课,在讲解知识的清晰和明了方面,能超越我的人,我至今都没见过。
这本《C++新经典:数据结构与算法》纸质书籍是我在做“C++数据结构与算法视频课”时 随该视频课附送的纸质书籍(内容与视频课完全相同)。当时送出了一些,还有一些留在家里,随着这几年我工作重心的转移,书就一直摆在那里,很占地方,今日,经过考虑,将这些书籍免费赠送给需要的人,一能节省我的摆放空间,二能将书送给有需要的人帮助他们成长,也等于增加了我的福报——虽然我会亏很多印刷的费用,说明如下:
(1)书籍没有书号,不能销售,我是免费赠送,这一点请大家明确;
(2)书籍质量非常高,基本上会超越绝大部分同类书籍,660页全彩色印刷;
(3)书籍数量有限,每人限一本,送完即止;
(4)邮费要你们自付,我统一用顺丰快速发出,邮费大概要在15~25元之间,发快递时我会选择到付,也就是说,大家收到快递后要自己支付快递费;
(5)学校、公益组织等机构需要也可以联系我;
(6)需要书籍者,请加我的微信 wangjw6517119,留下你的 姓名、电话号码、书籍邮寄地址,我会在1~2天内发出书籍,你将在书籍发出后2~3天时间内收到书籍;
书中的实现代码采用了一点C++模板的知识,学习者需要对C++模板有最基础的认识才可以看懂代码。
以下是书中主题、书籍完整目录和书籍外观截图,大家根据介绍内容查看是否自己是真的需要,如果真的需要,再联系我,不然一本书也很重,摆在家里吃灰不但没必要,也使更需要这本书的人失去了学习的机会。
【书中主题】
基本概念 数据结构和算法的基本概念,包括时间/空间复杂度表示法和分析法以及具体的编程环境搭建工作的介绍。
线性表 包括顺序表、各种链表、栈、共享栈、普通和双端队列。
树 包括普通二叉树、线索二叉树、二叉查找树(平衡二叉树、红黑树)、哈夫曼树、多路查找树(B树、B+树)。
图 包括图的存储结构,图的深度优先和广度优先遍历、最小生成树、最短路径、拓扑排序、关键路径。
排序 包括插入类排序、交换类排序、选择类排序、归并排序、桶思想的排序等。
跳表与哈希表 包括跳表与哈希表的基本概念和基本操作。
字符串 包括字符串的顺序和链式存储结构、字符串的朴素模式匹配算法、字符串的KMP模式匹配算法。
算法设计方法 包括贪心算法、分治算法、回溯算法、动态规划算法。
高级实用算法 包括A*寻路算法、用洪水填充算法实现通畅的随机地图。
【书籍完整目录】
第1章 基本概念、算法复杂度、编程环境介绍 12
1.1 数据结构与算法概述 12
1.2 算法的效率度量 15
1.2.1 算法的时间复杂度分析 15
1. 大O时间复杂度表示法 15
2. 算法时间复杂度计算规则 17
3. 常见算法时间复杂度分析 18
4. 常见算法时间复杂度总结 22
1.2.2 算法的空间复杂度分析 23
1.3 C++编程环境介绍 26
1.3.1 C++编程环境搭建说明 26
1.3.2 创建最基本的能运行的C++程序 29
1.3.3 Visual Studio中程序的调试方法 31
1. 普通的断点调试(跟踪调试) 31
2. 学会调试时查看内存中的内容 32
3. 快速监视窗口 33
第2章 线性表 35
2.1 线性表概述 35
2.2 线性表的顺序存储 35
2.2.1 顺序表 37
1. 顺序表的类定义、初始化和释放操作 37
2. 顺序表元素插入操作 38
3. 顺序表元素删除操作 40
4. 顺序表元素获取操作 42
5. 顺序表元素的其他常用操作 43
2.2.2 顺序表的扩展操作 45
2.2.3 顺序表的特点 46
2.3 线性表的链式存储 46
2.3.1 单链表 47
1. 单链表的类定义、初始化操作 48
2. 单链表元素插入操作 49
3. 单链表元素删除操作 53
4. 单链表元素获取操作 55
5. 单链表元素的其他常用操作 56
6. 单链表的释放操作 58
7. 单链表的特点及代码书写和测试建议 59
2.3.2 双链表 59
1. 双链表的类定义、初始化操作 59
2. 双链表元素插入操作 61
3. 双链表元素删除操作 62
4. 双链表的特点 62
2.3.3 循环链表 63
1. 单循环链表 63
2. 双循环链表 65
2.3.4 静态链表 67
1. 静态链表的类定义、初始化操作 67
2. 静态链表元素插入操作 69
3. 静态链表元素显示、获取等操作 72
4. 静态链表元素删除操作 75
5. 静态链表的使用总结 77
2.4 栈 78
2.4.1 栈的顺序存储(顺序栈) 79
1. 顺序栈的类定义、初始化和释放操作 79
2. 顺序栈的入栈、出栈、获取栈顶元素、显示元素等操作 80
3. 共享栈 84
2.4.2 栈的链式存储(链式栈/链栈) 87
2.4.3 栈存在的意义和应用举例 90
1.保存临时数据 90
2. 利用栈来进行括号匹配的检验 91
3. 计算表达式结果 93
2.5 队列 93
2.5.1 队列的顺序存储(顺序队列) 94
1.基础实现代码 94
2.循环队列 98
2.5.2 队列的链式存储(链式队列) 102
2.5.3 双端队列 107
第3章 树 109
3.1 树形结构的基本概念 109
3.2 二叉树 110
3.2.1 基本概念 110
3.2.2 特殊二叉树 111
1. 满二叉树 111
2. 完全二叉树 112
3. 斜树 113
3.2.3二叉树的性质 113
3.2.4二叉树的遍历 115
1. 前序遍历、中序遍历、后序遍历基本概念 115
2. 前序、中序、后序遍历简单范例 116
3. 前序、中序、后序遍历针对3层满二叉树的遍历顺序范例 116
4. 前序、中序、后序遍历针对普通二叉树的遍历顺序范例及伪代码 117
5. 二叉树遍历的推导以及遍历的一些结论 120
6. 扩展二叉树/扩充二叉树 123
7. 层序遍历/层次遍历 124
3.2.5二叉树的存储结构 126
1. 顺序存储方式 126
2. 链式存储方式 128
3.2.6二叉树顺序存储的常用操作 129
3.2.7二叉树链式存储的常用操作 134
1. 类定义、初始化和释放操作 134
2. 创建树节点操作 135
3. 遍历操作 137
4. 其他常用操作 140
5. 非递归遍历操作 142
6. 通过遍历序列创建二叉树 147
3.2.8线索二叉树(Threaded Binary Tree) 149
1. 基本概念 149
2. 二叉树的线索化 151
3. 线索二叉树的操作 157
3.2.9二叉查找树(Binary Search Tree) 166
1. 基本概念及定义 166
2. 常见操作 167
3. 实际应用说明 178
4. 二叉查找树如何存储重复节点 179
5. 二叉查找树时间复杂度分析 179
3.2.10平衡二叉树(Balanced Binary Tree) 181
1. 基本概念、定义及基础实现代码 181
2. 平衡二叉树插入操作后的平衡性调整及实现代码 183
3. 平衡二叉树删除操作后的平衡性调整及实现代码 199
3.2.11红黑树(Red-Black Tree) 207
1. 基本概念、定义及基础实现代码 207
2. 红黑树插入操作后的平衡性调整及实现代码 211
3. 红黑树删除操作后的平衡性调整及实现代码 226
4. 红黑树合法性测试代码 260
5. 红黑树插入和删除操作需要进行的平衡性调整的各种情况总结 263
3.2.12哈夫曼树(Huffman Tree) 264
1. 基本术语、概念 264
2. 哈夫曼树的构造及相关的代码实现 265
3. 哈夫曼编码及相关的代码实现 272
3.2.13 树、森林与二叉树的转换 276
1. 树的存储结构 276
2. 树转换为二叉树 284
3. 森林及森林转换为二叉树 286
4. 二叉树转换为树 287
5. 二叉树转换为森林 288
6. 树的遍历 289
7. 森林的遍历 291
3.3 多路查找树 293
3.3.1 B树 293
1. 基本概念、定义及基础实现代码 293
2. B树的插入操作及实现代码 296
3. B树的删除操作及实现代码 306
3.3.2 B+树 317
1. 基本概念、定义及基础实现代码 317
2. B+树的插入操作 317
3. B+树的删除操作 320
3.3.3 B树和B+树在数据库中的应用 324
1. B+树在数据库中的应用举例 324
2. B+树在MySQL数据库中的应用 327
3. B+树与B树读取区别以及各自优缺点总结 329
4. 为什么MySQL数据库不采用B树创建表索引 330
第4章 图 332
4.1 图的基本概念、术语 332
4.2 图的存储结构及基本操作 341
4.2.1 邻接矩阵 341
4.2.2 邻接表 348
4.2.3 十字链表 359
4.2.4 邻接多重表 361
4.2.5 边集数组 365
4.2.6 图各种存储结构的比较 366
1.邻接矩阵 366
2.邻接表 366
3.十字链表 366
4.邻接多重表 366
5.边集数组 366
4.2.7 图的遍历(以邻接表作为图的存储结构) 366
1.深度优先遍历(DFS) 367
2.广度优先遍历(BFS) 370
3.深度与广度优先遍历的空间与时间复杂度 373
4.3 图的应用之最小生成树 374
4.3.1 普里姆(Prim)算法 375
4.3.2 克鲁斯卡尔(Kruskal)算法 385
4.4 图的应用之最短路径 393
4.4.1 迪杰斯特拉(Dijkstra)算法 394
4.4.2 弗洛伊德(Floyd)算法 407
4.5 图的应用之拓扑排序 413
4.5.1 拓扑排序基本概念 413
4.5.2 拓扑排序和逆拓扑排序算法 415
4.6 图的应用之关键路径 418
4.6.1基本概念 418
4.6.2关键路径算法实现 424
第五章 排序 435
5.1 基本概念 435
5.2 插入类排序 436
5.2.1 直接插入排序(Straight Insertion Sort) 436
5.2.2 折半(二分)插入排序(Binary Insertion Sort) 438
5.2.3 2路插入排序(Two-Way Insertion Sort) 440
5.2.4 表插入排序(Table Insertion Sort) 443
5.2.5 希尔排序(Shell Sort) 446
5.3 交换类排序 452
5.3.1 冒泡排序(Bubble Sort) 452
5.3.2 快速排序(Quick Sort) 455
1. 快速排序概述及实现代码 455
2. 快速排序算法效率分析 459
5.4 选择类排序 462
5.4.1 简单选择排序(Simple Selection Sort) 462
5.4.2 树形选择排序(Tree Selection Sort) 464
5.4.3 堆排序(Heap Sort) 471
1. 堆的基本概念 472
2. 堆排序算法 472
3. 堆中元素的插入和删除 476
4. 堆排序算法效率分析 477
5.5 归并排序(Merging Sort) 478
5.5.1 基本概念、实现代码、复杂度分析 478
5.5.2 非递归实现方式 484
5.6 桶思想的排序 486
5.6.1 计数排序(Count Sort) 486
1. 非稳定的计数排序算法的实现 486
2. 计数排序算法效率分析 488
3. 计数排序算法稳定性问题以及算法空间复杂度的改变 488
5.6.2基数排序(Radix Sort) 492
1. 基本概念、实现代码 492
2. 基数排序算法效率分析 496
3. 基数排序算法的应用 496
5.6.3 桶排序(Bucket Sort) 497
1. 基本概念 498
2. 桶排序算法复杂度分析 499
5.7 内部排序算法分类、复杂度、稳定性整理表 500
第六章 跳表与哈希表 502
6.1 跳表(Skip List) 502
6.1.1 基本概念,在跳表中查询及复杂度分析 502
6.1.2 在跳表中插入数据 504
6.1.3 从跳表中删除数据 506
6.1.4 实现代码 508
6.1.4 跳表、红黑树、B+树? 514
1. MySQL为什么用B+树实现索引而不用跳表 514
2. Redis为什么用跳表实现有序集合而不是用红黑树/B+树/二叉树实现 515
6.2哈希表/散列表(Hash Table) 515
6.2.1 基本概念 515
6.2.2 哈希函数、哈希算法简介 517
6.2.3 哈希函数算法效率分析 521
6.2.4 哈希表实现源码 521
6.2.5 哈希算法的主要应用领域 526
第七章 字符串 528
7.1 基本概念、术语 528
7.2 串的顺序存储结构 528
7.2.1定长数组(静态数组)存储结构及基本操作的实现 528
7.2.2动态数组(堆中分配内存)存储结构及基本操作的实现 534
7.3 串的链式存储结构 541
7.4 串的朴素模式匹配算法 542
7.5 串的KMP模式匹配算法 548
7.5.1 朴素模式匹配算法的问题 548
7.5.2 KMP模式匹配算法观察1 549
7.5.3 KMP模式匹配算法观察2 551
7.5.4 KMP模式匹配算法实现代码 556
7.5.5 KMP模式匹配算法性能分析 564
7.5.6 KMP模式匹配算法的改进 564
1. next数组使用中暴露的问题 564
2. nextval数组的求解步骤 567
3. nextval数组的工作原理 569
4. nextval数组的求解实现代码 571
第八章 算法设计方法 576
8.1 贪心算法 576
8.1.1 几个基本的贪心算法案例 576
1. 分配问题 576
2. 区间覆盖问题 577
3. 股票买卖最佳时机问题 577
8.1.2 贪心算法的应用、解题步骤及使用 579
8.2 分治算法 579
8.2.1分治算法案例——粗暴法求最大数组连续子序列和值 580
8.2.2分治算法案例——分治法求最大数组连续子序列和值 581
8.3 回溯算法 586
8.3.1组合问题-LeetCode网站第77题 586
8.3.2组合总和问题-LeetCode网站第39题 592
8.3.3分割字符串问题-LeetCode网站第131题 596
8.3.4 n皇后问题-LeetCode网站第51题 599
8.4 动态规划算法 605
8.4.1 斐波那契数列-LeetCode网站第509题 606
8.4.2 爬楼梯-LeetCode网站第70题 608
8.4.3 0-1背包问题——用二维数组实现 609
8.4.4 找出最长的递增子序列-LeetCode网站第300题 615
8.4.5 打家劫舍-LeetCode网站第198题 619
8.4.6 零钱兑换-LeetCode网站第322题 624
8.4.7 打家劫舍题目-动态规划递归写法的实现 628
8.4.8 动态规划总结 632
8.5 贪心、分治、回溯、动态规划算法的联系和区别 633
第九章 高级实用算法 634
9.1 用A*搜索算法实现游戏中的寻路功能 634
9.1.1 A*寻路算法的基本概念描述 634
9.1.2 A*寻路算法的细节阐述 635
9.1.3 A*寻路算法的代码实现 641
9.2 用洪水填充算法实现通畅的随机地图 651
9.2.1 洪水填充算法基本概念和实现通畅随机地图原理 652
1. 洪水填充算法基本概念 652
2. 洪水填充算法实现通畅随机地图原理 652
9.2.2 洪水填充算法实现通畅随机地图代码 654
【书籍外观截图】
【源码获取】
本书的全部C++源代码,通过扫描下面的二维码或者查找并关注作者的公众号“程序员速成”并在其中输入“数据结构”获取。更多的C++视频教程也可以在该公众号的商城中找到。

暂无评价内容

当前课程暂无配套资料