
数据结构与算法
文章平均质量分 89
这里将会发布所有常用的数据结构与算法的c++实现代码及讲解,思路来源于各个大佬,我将会整理成笔记。
Pandaconda 的测开之路
名不显时心不朽,再挑灯火看文章。
曾任职于字节跳动服务端开发岗,现任职于字节跳动测试开发岗。
专注于分享自己的学习踩坑之路,尽全力将知识转换成易懂的形式吐出来,帮助新人能够快速入门,老手也可以当字典参考。欢迎一起讨论,共同成长!
展开
-
【C++图解专栏】手撕数据结构与算法,探寻算法的魅力
在这个专栏,我将带着大家一起用 C++ 手撕基础的数据结构与算法,希望能够带领大家快速入门这个课程。数据结构与算法是大学计算机专业课中最重要的一门,学起来必然不轻松,所以遇到困难是非常正常的一件事。相信我,只要能够坚持下去,自己动手敲一遍一定会有不少的收获!原创 2022-08-20 22:32:59 · 12670 阅读 · 42 评论 -
【C++算法图解专栏】一篇文章带你掌握差分算法
前面我们讲到了前缀和算法,这一讲我们来看看前缀和的逆运算即差分算法是什么,在有些题中需要我们对一个区间上的所有数进行加减操作,如果通过循环一个个加减时间复杂度会很高,这时差分算法就派上用场了,下面我们来看看差分是如何解决这类问题的,并且会进行小小的扩展,延伸到差分矩阵问题的解决。原创 2023-02-02 16:08:08 · 4924 阅读 · 12 评论 -
【C++算法图解专栏】一篇文章带你入门二分算法
这一讲我们来介绍一个经常出现在我们视野中的算法 —— 二分法,在介绍算法的基础上会为大家总结出模板。原创 2023-01-30 16:35:33 · 1030 阅读 · 10 评论 -
【C++算法图解专栏】一篇文章带你掌握尺取法(双指针)
这一讲我们来介绍一个非常常用的算法 —— 尺取法,一般称为双指针算法,下文也将用这种说法。这种算法应用场景挺广,在很多题目中只是作为解出题目的其中一个关键部件,下面我将给没接触过的小伙伴详细讲解,会从模板题入手,不会直接上综合题,这点大家放心~原创 2023-01-27 16:43:39 · 1160 阅读 · 9 评论 -
【C++算法图解专栏】一篇文章带你掌握前缀和算法(一维+二维)
在有些题目中,需要我们快速的获得一个区间值的和,如果每次查询都循环一个个加的话,时间复杂度会比较大,这时候就要用到前缀和算法,查询区间和的时候,时间复杂度只有 O(1),废话少说,直接上图解。原创 2023-01-21 17:42:12 · 1882 阅读 · 6 评论 -
【C++算法图解专栏】一篇文章带你掌握高精度加减乘除运算
C++ 本身自带的数字类型无法解决特别大的数的运算,会出现溢出的情况,这时候我们就需要一些算法来模拟大数的运算过程,从而得到最终的结果。接下来我将带领大家学会高精度的加减乘除运算,这样以后再遇到类似问题就不用再怕啦!原创 2023-01-19 17:22:15 · 1867 阅读 · 3 评论 -
C++实现排序 - 03 计数排序、桶排序和基数排序
数据结构与算法专栏 —— C++实现计数排序是去统计每个值在数组中的数量,然后依次放在它们应该在的位置,所以这个算法不适合数组中的值过大,因为这是用空间来换时间。并且,计数排序也不适合按照字符串进行排序。算法步骤如下:直接上图:我们对数组先进行遍历,统计每个数值的个数。统计完数量后,计算前缀和:然后对每个元素的位置进行推断,可能会有小伙伴比较疑惑为什么要弄的这么麻烦,直接从前往后根据下标输出不就好了吗。这是因为每个元素都是一个个体,如果遇到相同元素为了保证稳定性,即排序后相同元素前后次序和原数组中的前后顺序原创 2022-06-28 16:10:21 · 1308 阅读 · 2 评论 -
C++实现排序 - 02 归并排序、快速排序和堆排序
数据结构与算法专栏 —— C++实现归并排序采用了分治法的思想,不断将两个有序的序列进行合并从而最终得到整个有序的序列,算法步骤如下:直接上图:我们先对序列进行划分操作:然后对各个子序列进行回溯:通过合并操作,得到最终的子序列。快速排序快速排序也是利用了递归思想,算法步骤如下:直接上图:第一步:选取第一个数作为基准数。第二步:从后往前找一个比基准数小的数放到前面。第三步:从前往后找到一个比基准数大的树放到后面。第四步:继续从后往前查找,发现 first 和 last 重合,本次遍历结束,并将基准数放到指原创 2022-06-28 14:03:23 · 1921 阅读 · 0 评论 -
C++实现排序 - 01 冒泡、选择、插入和希尔排序
冒泡排序正如其名,这个算法像是泡泡一样往上升,具体步骤如下:为了方便理解,我们还是来看图:第一步:比较第一个元素与第二个元素,不存在逆序,后移一位。第二步:比较第二个元素和第三个元素,不存在逆序,后移一位。第三步:比较第三个元素和第四个元素,不存在逆序,后移一位。第四步:比较第四个元素和第五个元素,存在逆序,交换两者,后移一位。第五步:比较第五个元素和第六个元素,存在逆序,交换两者,后移一位。第六步:比较第六个元素和第七个元素,存在逆序,交换两者,后移一位。第七步:比较第七个元素和第八个元素,存在逆序,交换原创 2022-06-28 10:33:28 · 2298 阅读 · 2 评论 -
C++实现查找 - 顺序、二分和哈希查找
数据结构与算法专栏 —— C++实现大家看到顺序查找可能第一时间会想到从前往后遍历,遇到与关键值相等的就输出其下标。这里我们来优化一下,让数组从下标为 1 的地方开始存储元素,然后将下标为 0 的地方放入查找关键值作为哨兵位。这样的好处就是不用去担心数组越界的问题,当遍历到数组为 0 的时候说明就查找失败,并且直接返回 -1 即可。二分查找二分查找正如其名,我们将区间分成两半进行查找:我们直接上图来理解:第一步:初始化指针,并得到 mid = left + right >> 1 ,即 mid = 4 。原创 2022-06-27 22:58:15 · 3693 阅读 · 0 评论 -
C++实现图 - 06 关键路径
数据结构与算法专栏 —— C++实现关键路径和最短路径不同,它反而去找最长路径,这种意义何在呢,我们来看个例子。假设小明小王小李参与一个大项目,这个大项目需要他们三个共同完成,也就是说这三人缺一人这项目都完成不了。现在这个大项目上面规定他们在半年内完成,假如小明小李分到的任务比较轻,在截止日期前就完成了,但是小王的任务比较难,快到期了都还没完成。这时候就算小明小李完成了这个大项目仍然无法提交,需要等小王那一部分完成了才可以提交,换句话说这个大项目最终花费的时间由完成时间最久的小王来决定。还是拿图来说话,下列原创 2022-06-26 21:16:29 · 2261 阅读 · 4 评论 -
C++实现图 - 05 拓扑排序
数据结构与算法专栏 —— C++实现听名字应该很好理解,就是图中存在有向环,我们先看一个有向无环图。我们只需要改动上图一条边,它就成为了一个有环图。拓扑排序就是对一个有向无环图构造拓扑序列的过程,听起来可能不知道从何下手,其实算法步骤很简单:重复上述两步,直至全部顶点均已输出,或者当前图不存在无前驱的顶点为止,后一种情况说明有向图中存在环。下面我们将用有向无环图和有向有环图进行举例。下图是一张有向无环图,现在我们开始进行算法步骤:第一步:找到图中没有前驱的结点,目前图中只有一个结点 1 没有前驱。第二步原创 2022-06-21 18:29:31 · 1489 阅读 · 0 评论 -
C++实现图 - 04 最短路径
数据结构与算法专栏 —— C++实现迪杰斯特拉算法是一个单源点的一个最短路径算法,也就是说,我们这个算法会求得从一个顶点到其所有顶点的最短路径。这个算法需要用到邻接矩阵来存储所有边值,并且需要一个辅助数组来更新最短路径,需要一个路径数组存储最短路径的结点,还需要一个状态数组来判断当前结点是否已经加入最短路径。这样说可能会有点晕,我们还是先来看图,假设有这样一张图:现在,我们要找到结点 0 到结点 8 的最短路径,步骤如下:第一步:初始化我们上述提到的三个数组,将结点 0 加入数组中,并更新辅助数组即结点 0原创 2022-06-20 18:02:56 · 2499 阅读 · 0 评论 -
C++实现图 - 03 最小生成树
数据结构与算法专栏 —— C++实现一个连通图的生成树是一个极小的连通子图,它包含图中全部的 n 个顶点,但只有构成一棵树的 n-1 条边。说人话就是我要用最少的边将所有结点连接起来,直接上图:而这个原图的生成树就有一下三个:由此可以知道对于包含 n 个顶点的无向完全图最多包含 n 的 n-2 次方颗生成树。最小生成树是带权图当中所有边权之和最小的生成树,对于一个无权图它只有生成树而没有最小生成树。我们还是直接看图理解,假设有这样一个带权无向图:那么我们可以得到它的最小生成树:通过计算可以知道,其所有边权原创 2022-06-05 20:30:09 · 5731 阅读 · 0 评论 -
C++实现图 - 02 图的遍历(DFS、BFS)
数据结构与算法专栏 —— C++实现深度优先搜索 ,简称为 DFS 。事实上,我们在树的遍历中早已涉及 DFS ,层、前序遍历、中序遍历和后序遍历都属于深度优先遍历的方式,因为这些遍历方式本质上都归结于栈。为了方便大家理解,我们还是以画图的方式来呈现(我们从结点 1 开始遍历):1、从结点 1 的第一个相邻结点即结点 2 开始遍历,先遍历哪个点一般取决于存储边的时候是以什么方式进行。2、以相同的方式继续沿结点的第一个相邻结点即结点 2 遍历,就这样一直往前递归遍历直至无法继续向前。3、同上,往结原创 2022-06-03 19:59:33 · 3151 阅读 · 0 评论 -
C++实现图 - 01 图的概述及实现
写在前面:前面我们讲的数据结构都是针对于一对一或一对多的情形,如果涉及到多对多的复杂情况就要用到我们接下来讲解的图了,这一讲我们重点讲解邻接表、邻接矩阵、十字链表以及邻接多重表的代码实现。如果已经对图的概念比较熟悉的小伙伴,可以拉到下面看相关的代码实现。图的概述图 G 是由两个集合 V 和 E 组成,记为 G = (V,E),其中 V 代表顶点,E 代表边,如下图(这里涉及到有向边和无向边,下面会展开讲)。图的相关概念简单图在图结构中,若不存在顶点到其自身的边,且同⼀条边没有重复出现,则称这.原创 2022-05-24 19:11:44 · 3668 阅读 · 2 评论 -
C++实现树 - 08 并查集
并查集是一种非常精巧而实用的树形数据结构,他主要是处理一些不相交集合的合并和查询的问题。比如我给定一些数字并给定它们属于哪个集合,并且每次询问当中的两个数字时可以告诉我这两个数字是否处于同一个集合,这就是一个典型的并查集问题。我们可以利用一个数组来存储每个元素的相邻结点:每次合并两个结点时就只用将一个结点数组中的值改成另一个结点的数值即可,假如我们想合并(4,3),(3,2),(2,1),在图中显示出来就会得到下面的结果:由此我们也可以发现这样子做如果遇到最坏情况时,会使查找的时间复杂度非常的大,这时候我们原创 2022-06-04 18:33:34 · 874 阅读 · 0 评论 -
C++实现树 - 07 平衡二叉树
写在前面:这一讲我们来讲讲目前为止难度最大的一种树,当然后面要有 B 树、B+ 树和红黑树等着我们。同样,我会将详细的代码附到详解的最后。平衡二叉树的定义我们之前学了二叉排序树,但是二叉排序树存在一个致命的问题,如果我每次插入的值都比上一次插入的大,那它就会形成一个斜树,这对我们的查找删除等功能影响很大。我们经过平衡操作就可以得到这样一颗树(具体如何操作下面会讲到):所以平衡二叉树就由此诞生了,平衡二叉树定义其可以为空树,但是每个结点的左右子树的高度只差不能超过 1 ,所以就引入了一个新概.原创 2022-05-29 15:08:24 · 1897 阅读 · 2 评论 -
C++实现树 - 06 哈夫曼树编码
写在前面:这一讲我们来学习一个比较有趣的树 —— 哈夫曼树,在许多非常知名的算法里也出现了哈夫曼树,这一讲我们就好好来唠唠什么是哈夫曼树。前置概念什么是结点路径的长度原创 2022-05-16 18:51:52 · 5625 阅读 · 7 评论 -
C++实现树 - 05 线索二叉树
写在前面:上一讲我们实现了代码量较大的二叉排序树,这一讲我们讲一个新的类型 —— 线索二叉树。这一讲代码量不多,但在理解上需要大家花一点功夫~思考在我们之前学到的树中可以发现,一个拥有 N 结点的二叉树,它一定有 N-1 条边是指向节点的即有效分支,但是有 2N-(N-1) = N+1 条边是指向空指针域的,这就导致了空间上的浪费。此外,当对二叉树进行中序遍历时可以得到二叉树的中序序列。如果所示,中序遍历的结果为 6 3 7 1 2 。但是,这种关系的获得是建立在完成遍历后得到的,那么可不可以.原创 2022-05-08 19:04:28 · 1514 阅读 · 2 评论 -
C++实现树 - 04 二叉树的构建(数组)
写在前面:通过前面两讲的学习,大家可能对二叉树有了比较深的感悟,但可能会发现一个小问题,我们在构建二叉树的时候都是一个个插入的,非常的不方便。那么这节课我们就来看看,如何通过输入一个数组来快速构建起一个二叉树。完全二叉树的构建在前面的学习中,我们知道了完全二叉树有一个非常 nice 的性质,它每个结点的左孩子在数组中的位置等于 2x ,右孩子等于 2x+1 。通过这个性质,我们可以快速的构建起一个二叉树。......原创 2022-05-12 11:24:14 · 4815 阅读 · 0 评论 -
C++实现树 - 03 二叉排序树
写在前面:上一讲我们介绍了二叉树的代码实现以及其遍历方法,这一讲我们来看一看进阶版的二叉树 —— 二叉排序树。性质二叉排序树它和普通的二叉树不同:(1)如果根结点的左子树不为空,那么它左子树的所有结点的值都小于根结点。(2)如果根结点的右子树不为空,那么它右子树的所有结点的值都大于根结点。(3)根结点的左子树和右子树同样遵循上面两条性质。根据性质我们可以知道,这颗排序二叉树的实现必然逃不了递归了,接下来我们来看看排序二叉树的代码是如何实现的。二叉排序树的构建及插入假设我们要构建起下面这.原创 2022-05-07 18:21:19 · 2820 阅读 · 0 评论 -
C++实现树 - 02 二叉树
写在前面:这一讲我们来看看二叉树的实现,还不清楚树的结构的小伙伴建议先看看上面一讲关于树的定义。二叉树的定义二叉树是每个结点最多有两个子树的树结构。也就是说二叉树不允许存在度大于2的树。它有五种最基本的形态:二叉树可以是空集。根可以有空的左自树或者右子树;或者左右子树都是空。其中只有左子树或者右子树的叫做斜树。二叉树的主要性质性质结论性质一在二叉树的 i 层上至多有 2 ^ ( i - 1 ) 个结点( i >= 1 )性质二深度为 k 的二叉树至多有 2.原创 2022-05-04 19:36:59 · 6214 阅读 · 0 评论 -
C++实现树 - 01 树的三种表示法
写在前面:今天我们开始进入树的学习啦,在学习高级搜索树之前,我们先看看一些简单树的实现,先理解好概念,入门就很快了。树的定义之前我们学习的是线性表,也就是线性的存储结构。今天我们开始学习非线性的存储结构,树就是非线性的存储结构,它可以拥有一对多的元素。......原创 2022-05-01 11:46:16 · 4215 阅读 · 3 评论 -
C++实现线性表 - 06 队列(链表实现)
写在前面:上一讲,我们用的是数组来实现队列的功能,这一讲我们尝试用链表来实现,其实我认为链表实现比数组实现更容易理解一些。队列的插入书接前文,由于上一讲我们已经对队列的定义进行深入的讲解了,我们直接进入代码部分,同样我们也直接实现双端队列的功能。用链表进行操作其实就用到了之前我们讲的双向链表操作啦,对应到双端队列里就是左插入和右插入,左删除和右删除。为了方便,这里创建了头结点和尾结点,通过头结点和尾结点可以快速进行操作。具体操作和双向链表几乎一样,没有了解过的小伙伴可以看我之前讲的双向链表那一.原创 2022-04-14 19:32:08 · 1087 阅读 · 0 评论 -
C++实现线性表 - 05 队列(数组实现)
数据结构与算法C++代码实现之线性表队列部分原创 2022-04-02 19:06:19 · 2804 阅读 · 3 评论 -
C++实现线性表 - 04 栈
数据结构与算法C++代码实现之线性表栈部分原创 2022-03-01 19:08:12 · 2263 阅读 · 1 评论 -
C++实现线性表 - 03 双向循环链表
数据结构与算法C++代码实现之线性表双向循环链表部分原创 2022-02-28 21:22:42 · 1768 阅读 · 0 评论 -
C++实现线性表 - 02 单向链表
数据结构与算法C++代码实现之线性表单向链表部分原创 2022-02-28 19:16:55 · 3484 阅读 · 7 评论 -
C++实现线性表 - 01 数组
数据结构与算法C++代码实现之线性表数组部分原创 2022-02-21 17:21:05 · 4396 阅读 · 7 评论