c++
记录c++学习的点点滴滴
c栈算法小辰哥
华中农学院的大二计科,陪伴和爱着每一个支持我和帮助我的人
展开
-
高并发内存池性能测试
可以发现,两线程安全创建且内存正常申请,没有出现内存泄漏问题,打印不同证明二者的同步关系。比较malloc,free,new delete和我们的申请接口的效率。打印测试(线程同步测试与安全测试)测试成功,接下来会做进一步优化。malloc和free组:3。new和delete组:3。原创 2024-10-31 22:41:24 · 168 阅读 · 1 评论 -
高并发内存池测试问题集合1:内存申请的冲突与误用
页缓存没有问题,也就是申请没有问题,看看释放的问题,我们会发现size=0,所以无法进入大内存释放逻辑,所以应该赋值一下span->objsize。原因找到了,Maxbyte是32页,就要进入堆分配逻辑,但是Npages-1是128页,导致要进入堆的内存大小远远小于进入堆分配逻辑的要求大小。仍然不行,因为修改这一项会影响中心缓存的逻辑,如果它要申请70页的内存,直接给堆了,不合理,所以只能改回来。可以看到线程只有一个,由于创建的线程首先分配了1的内存 ,大内存虽然申请了下来,却无法释放。原创 2024-10-31 09:49:53 · 286 阅读 · 1 评论 -
高并发内存池1:内存申请与释放
高并发内存池第一版,实现内存申请和释放原创 2024-10-28 17:00:12 · 802 阅读 · 1 评论 -
用哈希封装unordered_map和unordered_set
我们称set的begin为A,哈希的begin为B,A的实现是对B的调用,在A的参数是普通迭代器时,B也是普通迭代器,B的返回值也是普通迭代器,但A的返回值是const迭代器,所以这里需要用普通迭代器创建一个const迭代器的临时变量,这就用到之前写的拷贝构造函数了。2.unordered_map不允许修改key,故普通迭代器和const的pair中的K都要加上const修饰,但是允许修改存储的data,所以普通和const迭代器一一对应。返回类型是迭代器,运用一个仿函数来寻找。后置++就是调用前置++原创 2024-08-12 10:54:29 · 174 阅读 · 1 评论 -
哈希表详解
5.哈希冲突的问题:1.当两个不同的键值被映射到同一个槽位时,其中一个键值的数据可能会被覆盖2.在发生冲突的槽位中,需要通过额外的操作来查找目标键值,这会增加查找的时间复杂度3.频繁的哈希冲突会导致哈希表的装载因子增加,使得哈希表的性能下降。2.直接地址法:key=key*A+B:优点:简单均匀,缺点:需要知道数据的分布状况,不然容易越界,一般在查找小且连续的情况下。2.哈希函数是数据映射的规则,有以下特征:1.其对应的散列表必须存储全部数据,数据的范围必须在散列表的范围中2.分布应该是均匀分布3.简单。原创 2024-08-10 21:39:04 · 463 阅读 · 0 评论 -
红黑树封装
迭代器分为两种,普通和const类型,所以它们的返回参数不能一样,为了它们俩可以调用同一个函数,将类模板的参数设置为3个,其中Ref代表const T&,Ptr代表const T*一个是不可修改即二叉搜索树的性质,一个是返回值不可修改即二叉树查找的性质。begin()返回的迭代器类型是const类型,但是红黑树里面的begin返回的是普通类型,所以要拷贝构造,进行类型转换。set的key不允许修改,所以set的迭代器和const迭代器的底层都是红黑树的const迭代器。2.模板参数第一个为K代表参数类型。原创 2024-08-09 20:48:39 · 268 阅读 · 0 评论 -
数据结构考前背代码:模拟卷,哈夫曼
【代码】数据结构考前背代码:模拟卷,哈夫曼。原创 2024-06-24 20:44:15 · 153 阅读 · 3 评论 -
数据结构期末背代码5:快速排序,堆排序
【代码】数据结构期末背代码5:快速排序,堆排序。原创 2024-06-20 18:38:49 · 166 阅读 · 1 评论 -
数据结构考前背代码4:二叉树的七种遍历和三种构建
【代码】数据结构考前背代码4:二叉树的七种遍历和三种构建。原创 2024-06-18 16:00:07 · 163 阅读 · 3 评论 -
数据结构考前背代码2:哈夫曼,希尔排序,拓扑排序
【代码】数据结构考前背代码2:哈夫曼,希尔排序,拓扑排序。原创 2024-06-17 08:50:50 · 202 阅读 · 3 评论 -
数据结构考前背代码1:最小生成树,插入排序,循环队列约瑟夫
3.循环队列实现约瑟夫环。原创 2024-06-15 10:16:34 · 182 阅读 · 2 评论 -
华农专业课拯救计划:模拟卷
现输入一组数据,以0作为输入的结束,从插入排序、希尔排序、快速排序、堆排序四种排序方法中挑选一种稳定的排序算法,对输入的数据进行从大到小的排序,给出排序后的结果。可以用连通网来表示n个城市以及n个城市之间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边的权值表示相应的代价。注意点:稳定的算法:冒泡,插入,归并,不稳定:快排,希尔,堆,时间复杂度为nlongn的为堆,归并,快排,除了希尔剩余为n方,且希尔介于二者之间,而赶时间选快排,省空间选堆排,稳定性归排,原创 2024-06-15 08:24:21 · 772 阅读 · 2 评论 -
数据结构实验期末押题卷2
1.链表:输出倒数第k个节点。3.哈夫曼树与哈夫曼编码。2.二叉树:层序遍历。原创 2024-05-30 22:04:50 · 137 阅读 · 3 评论 -
数据结构实验期末押题卷1
3.二叉树:两种遍历建树以及寻找共同祖先。4.图论:图的连通性与深度优先搜素。2.栈和队列:使用两个栈实现队列。1.链表部分:反转链表。原创 2024-05-29 18:02:57 · 192 阅读 · 3 评论 -
数据结构期末拯救计划:图的高阶算法
首先是一个常规的邻接表的存储方式,表示边的node数组以及头节点数组,in代表入度,data代表顶点数据,flag代表是否已经排序,edge代表边,再来解析排序本体,首先是排序数组res和邻接表G,首先定义一个栈,并且当点的入度为0时(表示是顶点),则入栈,当栈不为空的时候,提取栈顶元素并出栈,并将栈顶元素加入到res中,然后把这个顶点的边拿出来,让边的终点的入度减1,然后再对邻接表进行遍历,如果有新的入度为0的节点存在则重新入栈,然后就是邻接表的创建。当i和j相等的时候,保证对应的整数为0。原创 2024-05-29 08:37:26 · 970 阅读 · 3 评论 -
数据结构期末拯救计划:图的初阶应用(重点)
图的深度优先遍历,和普通的深度优先搜素一样,设置一个以形参引用形式的visit数组,以及引用形式的vector数组,以及位置pos(从1开始),注意为了从1开始,要多存储一个节点,递归出口为该节点以访问,每次打印数据都将visit的该位置赋值为true,再沿第一个节点的边进行遍历,如果边未访问则访问边,否则继续遍历。警察抓到了 n 个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。原创 2024-05-24 16:54:43 · 374 阅读 · 3 评论 -
数据结构期末拯救计划:哈夫曼树与哈夫曼编码
现在来解析两个函数,outpom为输出哈夫曼编码,limit为树根节点所在位置,pos为查找位置,从查找位置的父节点开始打印,如果pos是左节点打印0,是右节点打印1,然后向上继续查找(哈夫曼编码为从根节点到子节点的路径),由于以上原因,要反向打印,翻译函数解析如下:next为树根位置,输入哈夫曼编码,再遍历,寻找从根到给定节点的路径,如果为0则移向左孩子,如果为1则移向右孩子,如果已经移动到叶子节点则打印该点的字母编号,并将next回退到根节点位置。另,求解某字符串的哈夫曼编码,求解某01序列的译码。原创 2024-05-23 19:43:06 · 502 阅读 · 3 评论 -
数据结构期末拯救计划:树的线索化和树状打印
思路:set函数,使用一个前驱节点以改变left,如果根节点为空则返回,左节点为空则赋值前驱节点,如果前驱节点的右节点为空且前驱节点不为空,将它的后继节点赋值为当前根节点,并且更新前驱节点为当前节点,前序打印的思路首先找到最左侧且不是线索节点的节点,并且打印数据,饭后一直打印后继节点,并且结束后让根节点移动到右节点,creat就是按普通二叉树的构建。【问题描述】创建一棵二叉树,接着中序线索化该二叉树,然后编写相应函数遍历该中序线索二叉树。【输入形式】二叉树拓展的前序遍历序列。【输出形式】中序遍历序列。原创 2024-05-23 09:06:17 · 136 阅读 · 3 评论 -
数据结构期末拯救计划:二叉树(重点)
编写程序,计算二叉树中叶子结点的数目并输出;以下为层序遍历代码,层序遍历使用队列作为载体,并先将节点入队列,在队列不为空的时候,首先记录队列的元素数并且为返回数组开新的一层,然后遍历剩余元素(每次队列都是一层),每次出队列并且更新返回数组,如果有左右节点,则入队列准备成为新的一层。关键就是寻找公共祖先的函数,这是一个递归函数,当root为两节点任意一节点或者为空时返回root,然后递归调用左右节点,此时,这两个节点有两种情况,都在左,都在右或者一左一右,第一种返回左,第二种返回右,第三种返回根节点。原创 2024-05-22 23:01:38 · 972 阅读 · 3 评论 -
数据结构期末拯救计划:kmp算法
首先应付考试需要了解kmp的基础知识来做选择题,首先需要通过例子来了解一下最长相等前后缀,如abcdab的就是ab,aba的就是a,abba的也是a,还有一点需要特殊注意,如果选择题涉及到移动,只需记住把目标串从主串的最长相等前缀移到最长相等后缀即可。【问题描述】KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置。【输出形式】每组数据输出1行,输出后一个字符串在前一个字符串中的位置,如果不匹配,则输出0。原创 2024-05-21 22:25:59 · 194 阅读 · 3 评论 -
数据结构期末拯救计划:字符串
本题思路:本题采用一种简单的方法寻找子串,即从中间一点或两点(字符串长度为奇数为一点,偶数为两点,为了节省讨论直接全部试一遍),一个向左一个向右移动,直到越界或者不构成回文条件为止,注意截取时由于left越界需要加1,为什么截取长度为right-left-1,由于此时left为左边界的左侧元素,right为有边界的右侧元素,按照传统的长度计算right-left+1,而此时right和left的越界导致长度增加了2,所以right-left+1-2=right-left-1。(串),另一个为不包含*和?原创 2024-05-21 17:06:57 · 324 阅读 · 3 评论 -
数据结构期末拯救计划:队列
题目整体思路:将元素入栈,遵循先进后出的原则,再存储到队列中,此时存储顺序变为3,2,1,而队列遵循先进先出的原则,输出时也是1,2,3,利用这个性质,我们也可以实现两个栈实现队列以及两个队列实现栈的操作。【问题描述】已知Q是一个非空队列,S是一个空栈。仅使用少量工作变量以及对队列和栈的基本操作,编写一个算法,将队列Q中的所有元素逆置。队列也是一种典型的数据存储结构,遵循先进先出的原则队尾进元素,队头删元素,下面看看它的基本操作。【输入形式】输入的第一行为队列元素个数,第二行为队列从首至尾的元素。原创 2024-05-21 10:19:31 · 215 阅读 · 3 评论 -
数据结构期末拯救计划:链表的配套代码
2.双指针的典型应用:链表合并。3.环形链表的约瑟夫环问题。原创 2024-05-21 10:18:05 · 134 阅读 · 3 评论 -
数据结构期末拯救计划:栈
1.栈是一种典型的数据存储结构,存储中有先进后出的特点,下面看看栈的基本操作。【问题描述】请用“顺序栈”解决进制转换问题,请注意:不采用顺序栈,不给分。【输入形式】十进制数据和待转换的进制。3.括号匹配问题,也就是我压的一道题。【样例输入2】2608 16。2.顺序栈的应用:进制转换。【样例输入1】1348 8。【输出形式】转换后的数据。【样例输出1】2504。【样例输出2】A30。记忆这道题,按模板记。原创 2024-05-21 10:17:42 · 152 阅读 · 3 评论 -
数据结构期末拯救计划:单链表
这道题的方法非常典型,首先将数据存在两个链表上,根据双指针的算法,两个链表都需要进行排序以实现单调性,然后同时移动双指针,第一个链表的系数值大于第二个链表的系数值或者相反,则把该节点后插到新链表的后面,如果等于就相加并同时移动,循环结束条件为一个表遍历完,后续只需把没有遍历完的表接到新链表后面即可。【输入形式】第一行第一个数据n代表多项式的总项数,后面的2*n个数据,每一对代表对应的某一项的系数和指数,第二行类似,第三行的数据x要查询第几项。【输入形式】输入n和m的值,其中n为总人数,m为报数的密码。原创 2024-05-18 16:25:44 · 484 阅读 · 3 评论 -
华农专业课拯救计划:验证二叉搜索树序列
【问题描述】输入一个整数数组,判断该数组是不是某的的结果。如果是返回true,否则返回false。【输入形式】输入任意长度的数组,数字之间空格分开【输出形式】true 或者 false【样例输入】输入5 7 6 9 11 10 8【样例输出】true【样例说明】由于这一整数序列是如下树的后序遍历结果:8/ \6 10因此返回true。【评分标准】暴力求解法不得分。原创 2024-05-17 20:42:06 · 273 阅读 · 3 评论 -
华农专业课拯救计划:二叉搜索树的进阶应用
【问题描述】请根据输入的数据创建一棵二叉排序树。然后执行相应操作。1 删除某一值为x的结点2 求指定结点y在二叉排序树中的层数【输入形式】结点数据,以0代表结束输入。待删除的x,待求层数的y【输出形式】创建好的二叉排序树的拓展的前序遍历结果删除后的二叉排序树的中序遍历结果y所在的层数【样例输入】1011【样例输出】4【样例说明】若待删除的结点包含左右子树,则以其左子树的最右结点代替它。原创 2024-05-17 20:12:43 · 301 阅读 · 3 评论 -
华农专业课拯救计划:利用前序与中序遍历建树并判断是否是二叉排序树
【问题描述】课后作业第6题。试写一个判别给定二叉树是否为二叉排序树的算法。以前序遍历序列和中序遍历序列给出该二叉树的结点,并创建该二叉树。然后再进行判断。请注意,树中结点关键字可能相同。【样例输入1】【样例输出1】true【样例输入2】6 4 7 8 04 7 6 8 0【样例输出2】false【提示】若直接根据给定的中序是否有序来进行判断,此种判断方法不得分。务必先创建二叉树的链式存储,再对其进行判断。原创 2024-05-17 19:53:02 · 360 阅读 · 3 评论 -
华农专业课拯救计划:拓扑排序
【问题描述】由某个集合上的一个偏序得到该集合上的一个全序,这个操作被称为拓扑排序。偏序和全序的定义分别如下:若集合X上的关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。设R是集合X上的偏序,如果对每个x,y∈X必有xRy或yRx,则称R是集合X上的全序关系。由偏序定义得到拓扑有序的操作便是拓扑排序。拓扑排序的流程如下:1. 在有向图中选一个没有前驱的顶点并且输出之;2. 从图中删除该顶点和所有以它为尾的弧。重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。原创 2024-05-16 11:35:43 · 723 阅读 · 3 评论 -
华农专业课拯救计划:佛洛依德算法
【问题描述】对于下面一张若干个城市,以及城市之间距离的地图,请采用弗洛伊德算法求出所有城市之间的最短路径。【输入形式】顶点个数n,以及n*n的邻接矩阵,其中不可达使用9999代替【输出形式】每两个顶点之间的最短路径和经过的顶点注意:顶点自身到自身的dist值为0,path则为该顶点的编号【样例输入】4【样例输出】原创 2024-05-15 20:08:45 · 817 阅读 · 3 评论 -
华农专业课拯救计划:迪杰斯特拉算法
【问题描述】在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题。在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次序产生最短路径的算法。可将迪杰斯特拉算法描述如下:在本题中,读入一个有向图的带权邻接矩阵(即数组表示),建立有向图并按照以上描述中的算法求出源点至每一个其它顶点的最短路径长度。【输入形式】输入的第一行包含2个正整数n和s,表示图中共有n个顶点,且源点为s。其中n不超过50,s小于n。原创 2024-05-15 18:58:16 · 1398 阅读 · 4 评论 -
漫话算法:最短路径迪特拉斯算法
【代码】漫话算法:最短路径迪特拉斯算法。原创 2024-05-14 22:57:27 · 191 阅读 · 3 评论 -
图的最小生成树算法:普利姆算法(c++实现)
首先是找合适顶点的函数,首先传过来的是某一个顶点的关系(零阶矩阵的一行),遍历这个顶点的关系,找出权重最小的顶点进行返回,接着是普利姆算法的主要函数,数组key存储的是边到生成树顶点的距离,起到判断的作用,首先将顶点入树,然后开始找边(最小生成树如果有n个顶点则会有n-1条边,这里的mstsize为一个计数器),然后从第一个顶点开始寻找最小顶点,如果找不到则图不连通,如果它没有入树则作为起始点打印,否则作为边打印,然后更新key,parent,以及visited的值。原创 2024-05-10 09:42:08 · 365 阅读 · 4 评论 -
漫话算法:二分查找(带你刷题版)
9.来总结一下:使用二分要先判断数组是否具有二段性,如果具有二段性,则选择找左或者找右的模板,并且观察如果出现了-1则算中的时候+1。这是一个明显的找左节点的问题,这个题注意一点,就是注意模板中left+(right-left+1)与mid-1的绑定。这个题的重点在于关系不一定是相邻元素,也可能是其他关系,比如最后一个元素,这一点可以通过样例观察得出。这个不是经典的有序数组,但是是一个二段性数组,这个找左或者找右模板都可以。这个二段性比较难发现,left与right是由峰顶的寻找移动的。原创 2024-05-06 20:26:45 · 350 阅读 · 4 评论 -
漫话算法:滑动窗口(带你刷题版)
这里也可以做一个优化,因为当p是一个字符串数组而不是单词时每次遍历必定会超时,所以采用以下方法进行优化,思路为只处理框框里的元素,统计有效元素,即p中出现次数大于s对应字母出现位置时,为有效位置,当窗口过大时,缩窗口,当窗口正好且有效元素符合时,判断成功。参考了前几题的算法,这个题的思路也不难出,但需注意几点,首先注意left的更新,当符合条件应该逐步入栈,并且要对出窗口的操作进行判断,并且,hash以后用map吧,要不然容易出问题,最后一点,恶心用例直接if else好吧。原创 2024-05-05 16:28:12 · 706 阅读 · 3 评论 -
漫话算法:双指针(带你刷题版)
笔者很好奇,此题不管有什么方法,都会用到起码四个位置的加法比较,笔者不知道为什么会传入这么大的几个数,这样加法是必然过不了的,除非这题也要使用大数加法的计算,而这种题要搞这种是很无语的,日前力扣更新了一下,避免使用long sum存储结果导致逃避大数加法的情况,服。算法思想:左右两个指针依次往内部移动,如果相遇则停止,每一步都计算体积并实时更新,移动方法:移动当前值最小的指针,因为此时内部的数据是固定的,如果容器的宽减小的情况下,容器的长要尽可能长才有超越原来体积的机会,所以我们此时选择让短边的指针移动。原创 2024-05-04 08:37:32 · 1025 阅读 · 3 评论 -
数据结构图的创建和遍历(dfs,bfs,附代码)
图的邻接矩阵,邻接表存储,dfs递归非递归,bfs原创 2024-04-30 21:36:36 · 523 阅读 · 5 评论 -
力扣记忆化搜索:最长递增子串
【代码】力扣记忆化搜索:最长递增子串。原创 2024-04-28 18:09:00 · 186 阅读 · 3 评论 -
力扣记忆化搜索:不同路径
2.记忆化搜索就是创建一个表用于记录数据,并且每一步都要操作表,返回也要从表中取。原创 2024-04-28 12:00:35 · 172 阅读 · 3 评论 -
力扣洪水算法:扫雷游戏
【代码】力扣洪水算法:扫雷游戏。原创 2024-04-28 04:13:52 · 182 阅读 · 4 评论