漫话算法
关于数据结构和算法的详细讲解就在这里
c栈算法小辰哥
命运从来不语,但它却回答了所有问题
展开
-
数据结构考前背代码2:哈夫曼,希尔排序,拓扑排序
【代码】数据结构考前背代码2:哈夫曼,希尔排序,拓扑排序。原创 2024-06-17 08:50:50 · 53 阅读 · 0 评论 -
数据结构考前背代码1:最小生成树,插入排序,循环队列约瑟夫
3.循环队列实现约瑟夫环。原创 2024-06-15 10:16:34 · 73 阅读 · 0 评论 -
华农专业课拯救计划:模拟卷
现输入一组数据,以0作为输入的结束,从插入排序、希尔排序、快速排序、堆排序四种排序方法中挑选一种稳定的排序算法,对输入的数据进行从大到小的排序,给出排序后的结果。可以用连通网来表示n个城市以及n个城市之间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边的权值表示相应的代价。注意点:稳定的算法:冒泡,插入,归并,不稳定:快排,希尔,堆,时间复杂度为nlongn的为堆,归并,快排,除了希尔剩余为n方,且希尔介于二者之间,而赶时间选快排,省空间选堆排,稳定性归排,原创 2024-06-15 08:24:21 · 583 阅读 · 0 评论 -
数据结构实验期末押题卷2
1.链表:输出倒数第k个节点。3.哈夫曼树与哈夫曼编码。2.二叉树:层序遍历。原创 2024-05-30 22:04:50 · 89 阅读 · 3 评论 -
数据结构实验期末押题卷1
3.二叉树:两种遍历建树以及寻找共同祖先。4.图论:图的连通性与深度优先搜素。2.栈和队列:使用两个栈实现队列。1.链表部分:反转链表。原创 2024-05-29 18:02:57 · 151 阅读 · 3 评论 -
数据结构期末拯救计划:图的高阶算法
首先是一个常规的邻接表的存储方式,表示边的node数组以及头节点数组,in代表入度,data代表顶点数据,flag代表是否已经排序,edge代表边,再来解析排序本体,首先是排序数组res和邻接表G,首先定义一个栈,并且当点的入度为0时(表示是顶点),则入栈,当栈不为空的时候,提取栈顶元素并出栈,并将栈顶元素加入到res中,然后把这个顶点的边拿出来,让边的终点的入度减1,然后再对邻接表进行遍历,如果有新的入度为0的节点存在则重新入栈,然后就是邻接表的创建。当i和j相等的时候,保证对应的整数为0。原创 2024-05-29 08:37:26 · 909 阅读 · 3 评论 -
数据结构期末拯救计划:图的初阶应用(重点)
图的深度优先遍历,和普通的深度优先搜素一样,设置一个以形参引用形式的visit数组,以及引用形式的vector数组,以及位置pos(从1开始),注意为了从1开始,要多存储一个节点,递归出口为该节点以访问,每次打印数据都将visit的该位置赋值为true,再沿第一个节点的边进行遍历,如果边未访问则访问边,否则继续遍历。警察抓到了 n 个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。原创 2024-05-24 16:54:43 · 326 阅读 · 3 评论 -
数据结构期末拯救计划:哈夫曼树与哈夫曼编码
现在来解析两个函数,outpom为输出哈夫曼编码,limit为树根节点所在位置,pos为查找位置,从查找位置的父节点开始打印,如果pos是左节点打印0,是右节点打印1,然后向上继续查找(哈夫曼编码为从根节点到子节点的路径),由于以上原因,要反向打印,翻译函数解析如下:next为树根位置,输入哈夫曼编码,再遍历,寻找从根到给定节点的路径,如果为0则移向左孩子,如果为1则移向右孩子,如果已经移动到叶子节点则打印该点的字母编号,并将next回退到根节点位置。另,求解某字符串的哈夫曼编码,求解某01序列的译码。原创 2024-05-23 19:43:06 · 428 阅读 · 3 评论 -
数据结构期末拯救计划:树的线索化和树状打印
思路:set函数,使用一个前驱节点以改变left,如果根节点为空则返回,左节点为空则赋值前驱节点,如果前驱节点的右节点为空且前驱节点不为空,将它的后继节点赋值为当前根节点,并且更新前驱节点为当前节点,前序打印的思路首先找到最左侧且不是线索节点的节点,并且打印数据,饭后一直打印后继节点,并且结束后让根节点移动到右节点,creat就是按普通二叉树的构建。【问题描述】创建一棵二叉树,接着中序线索化该二叉树,然后编写相应函数遍历该中序线索二叉树。【输入形式】二叉树拓展的前序遍历序列。【输出形式】中序遍历序列。原创 2024-05-23 09:06:17 · 103 阅读 · 3 评论 -
数据结构期末拯救计划:二叉树(重点)
编写程序,计算二叉树中叶子结点的数目并输出;以下为层序遍历代码,层序遍历使用队列作为载体,并先将节点入队列,在队列不为空的时候,首先记录队列的元素数并且为返回数组开新的一层,然后遍历剩余元素(每次队列都是一层),每次出队列并且更新返回数组,如果有左右节点,则入队列准备成为新的一层。关键就是寻找公共祖先的函数,这是一个递归函数,当root为两节点任意一节点或者为空时返回root,然后递归调用左右节点,此时,这两个节点有两种情况,都在左,都在右或者一左一右,第一种返回左,第二种返回右,第三种返回根节点。原创 2024-05-22 23:01:38 · 919 阅读 · 3 评论 -
数据结构期末拯救计划:kmp算法
首先应付考试需要了解kmp的基础知识来做选择题,首先需要通过例子来了解一下最长相等前后缀,如abcdab的就是ab,aba的就是a,abba的也是a,还有一点需要特殊注意,如果选择题涉及到移动,只需记住把目标串从主串的最长相等前缀移到最长相等后缀即可。【问题描述】KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置。【输出形式】每组数据输出1行,输出后一个字符串在前一个字符串中的位置,如果不匹配,则输出0。原创 2024-05-21 22:25:59 · 165 阅读 · 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 · 288 阅读 · 3 评论 -
数据结构期末拯救计划:队列
题目整体思路:将元素入栈,遵循先进后出的原则,再存储到队列中,此时存储顺序变为3,2,1,而队列遵循先进先出的原则,输出时也是1,2,3,利用这个性质,我们也可以实现两个栈实现队列以及两个队列实现栈的操作。【问题描述】已知Q是一个非空队列,S是一个空栈。仅使用少量工作变量以及对队列和栈的基本操作,编写一个算法,将队列Q中的所有元素逆置。队列也是一种典型的数据存储结构,遵循先进先出的原则队尾进元素,队头删元素,下面看看它的基本操作。【输入形式】输入的第一行为队列元素个数,第二行为队列从首至尾的元素。原创 2024-05-21 10:19:31 · 187 阅读 · 3 评论 -
数据结构期末拯救计划:链表的配套代码
2.双指针的典型应用:链表合并。3.环形链表的约瑟夫环问题。原创 2024-05-21 10:18:05 · 108 阅读 · 3 评论 -
数据结构期末拯救计划:栈
1.栈是一种典型的数据存储结构,存储中有先进后出的特点,下面看看栈的基本操作。【问题描述】请用“顺序栈”解决进制转换问题,请注意:不采用顺序栈,不给分。【输入形式】十进制数据和待转换的进制。3.括号匹配问题,也就是我压的一道题。【样例输入2】2608 16。2.顺序栈的应用:进制转换。【样例输入1】1348 8。【输出形式】转换后的数据。【样例输出1】2504。【样例输出2】A30。记忆这道题,按模板记。原创 2024-05-21 10:17:42 · 117 阅读 · 3 评论 -
数据结构期末拯救计划:单链表
这道题的方法非常典型,首先将数据存在两个链表上,根据双指针的算法,两个链表都需要进行排序以实现单调性,然后同时移动双指针,第一个链表的系数值大于第二个链表的系数值或者相反,则把该节点后插到新链表的后面,如果等于就相加并同时移动,循环结束条件为一个表遍历完,后续只需把没有遍历完的表接到新链表后面即可。【输入形式】第一行第一个数据n代表多项式的总项数,后面的2*n个数据,每一对代表对应的某一项的系数和指数,第二行类似,第三行的数据x要查询第几项。【输入形式】输入n和m的值,其中n为总人数,m为报数的密码。原创 2024-05-18 16:25:44 · 424 阅读 · 3 评论 -
华农专业课拯救计划:验证二叉搜索树序列
【问题描述】输入一个整数数组,判断该数组是不是某的的结果。如果是返回true,否则返回false。【输入形式】输入任意长度的数组,数字之间空格分开【输出形式】true 或者 false【样例输入】输入5 7 6 9 11 10 8【样例输出】true【样例说明】由于这一整数序列是如下树的后序遍历结果:8/ \6 10因此返回true。【评分标准】暴力求解法不得分。原创 2024-05-17 20:42:06 · 234 阅读 · 3 评论 -
华农专业课拯救计划:二叉搜索树的进阶应用
【问题描述】请根据输入的数据创建一棵二叉排序树。然后执行相应操作。1 删除某一值为x的结点2 求指定结点y在二叉排序树中的层数【输入形式】结点数据,以0代表结束输入。待删除的x,待求层数的y【输出形式】创建好的二叉排序树的拓展的前序遍历结果删除后的二叉排序树的中序遍历结果y所在的层数【样例输入】1011【样例输出】4【样例说明】若待删除的结点包含左右子树,则以其左子树的最右结点代替它。原创 2024-05-17 20:12:43 · 263 阅读 · 3 评论 -
华农专业课拯救计划:利用前序与中序遍历建树并判断是否是二叉排序树
【问题描述】课后作业第6题。试写一个判别给定二叉树是否为二叉排序树的算法。以前序遍历序列和中序遍历序列给出该二叉树的结点,并创建该二叉树。然后再进行判断。请注意,树中结点关键字可能相同。【样例输入1】【样例输出1】true【样例输入2】6 4 7 8 04 7 6 8 0【样例输出2】false【提示】若直接根据给定的中序是否有序来进行判断,此种判断方法不得分。务必先创建二叉树的链式存储,再对其进行判断。原创 2024-05-17 19:53:02 · 319 阅读 · 3 评论 -
华农专业课拯救计划:拓扑排序
【问题描述】由某个集合上的一个偏序得到该集合上的一个全序,这个操作被称为拓扑排序。偏序和全序的定义分别如下:若集合X上的关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。设R是集合X上的偏序,如果对每个x,y∈X必有xRy或yRx,则称R是集合X上的全序关系。由偏序定义得到拓扑有序的操作便是拓扑排序。拓扑排序的流程如下:1. 在有向图中选一个没有前驱的顶点并且输出之;2. 从图中删除该顶点和所有以它为尾的弧。重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。原创 2024-05-16 11:35:43 · 680 阅读 · 3 评论 -
华农专业课拯救计划:佛洛依德算法
【问题描述】对于下面一张若干个城市,以及城市之间距离的地图,请采用弗洛伊德算法求出所有城市之间的最短路径。【输入形式】顶点个数n,以及n*n的邻接矩阵,其中不可达使用9999代替【输出形式】每两个顶点之间的最短路径和经过的顶点注意:顶点自身到自身的dist值为0,path则为该顶点的编号【样例输入】4【样例输出】原创 2024-05-15 20:08:45 · 769 阅读 · 3 评论 -
华农专业课拯救计划:迪杰斯特拉算法
【问题描述】在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题。在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次序产生最短路径的算法。可将迪杰斯特拉算法描述如下:在本题中,读入一个有向图的带权邻接矩阵(即数组表示),建立有向图并按照以上描述中的算法求出源点至每一个其它顶点的最短路径长度。【输入形式】输入的第一行包含2个正整数n和s,表示图中共有n个顶点,且源点为s。其中n不超过50,s小于n。原创 2024-05-15 18:58:16 · 1345 阅读 · 4 评论 -
漫话算法:最短路径迪特拉斯算法
【代码】漫话算法:最短路径迪特拉斯算法。原创 2024-05-14 22:57:27 · 144 阅读 · 3 评论 -
华农专业课拯救计划:普利姆算法
为什么这个搞不定?原因就在于遍历的方式上,第二种路径更为完整,第一种会缺东西。原创 2024-05-12 08:52:40 · 237 阅读 · 3 评论 -
华农专业课拯救计划:窗口问题(数据结构第9周实验)
【问题描述】在某图形操作系统中,有N个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变。如果你点击的位置不属于任何窗口,则系统会忽略你这次点击。现在我们希望你写一个程序模拟点击窗口的过程。【输入形式】输入的第一行有两个正整数,即N和M。原创 2024-05-12 08:34:06 · 389 阅读 · 3 评论 -
图的最小生成树算法:普利姆算法(c++实现)
首先是找合适顶点的函数,首先传过来的是某一个顶点的关系(零阶矩阵的一行),遍历这个顶点的关系,找出权重最小的顶点进行返回,接着是普利姆算法的主要函数,数组key存储的是边到生成树顶点的距离,起到判断的作用,首先将顶点入树,然后开始找边(最小生成树如果有n个顶点则会有n-1条边,这里的mstsize为一个计数器),然后从第一个顶点开始寻找最小顶点,如果找不到则图不连通,如果它没有入树则作为起始点打印,否则作为边打印,然后更新key,parent,以及visited的值。原创 2024-05-10 09:42:08 · 280 阅读 · 4 评论 -
漫话算法:二分查找(带你刷题版)
9.来总结一下:使用二分要先判断数组是否具有二段性,如果具有二段性,则选择找左或者找右的模板,并且观察如果出现了-1则算中的时候+1。这是一个明显的找左节点的问题,这个题注意一点,就是注意模板中left+(right-left+1)与mid-1的绑定。这个题的重点在于关系不一定是相邻元素,也可能是其他关系,比如最后一个元素,这一点可以通过样例观察得出。这个不是经典的有序数组,但是是一个二段性数组,这个找左或者找右模板都可以。这个二段性比较难发现,left与right是由峰顶的寻找移动的。原创 2024-05-06 20:26:45 · 306 阅读 · 4 评论 -
漫话算法:滑动窗口(带你刷题版)
这里也可以做一个优化,因为当p是一个字符串数组而不是单词时每次遍历必定会超时,所以采用以下方法进行优化,思路为只处理框框里的元素,统计有效元素,即p中出现次数大于s对应字母出现位置时,为有效位置,当窗口过大时,缩窗口,当窗口正好且有效元素符合时,判断成功。参考了前几题的算法,这个题的思路也不难出,但需注意几点,首先注意left的更新,当符合条件应该逐步入栈,并且要对出窗口的操作进行判断,并且,hash以后用map吧,要不然容易出问题,最后一点,恶心用例直接if else好吧。原创 2024-05-05 16:28:12 · 629 阅读 · 3 评论 -
漫话算法:双指针(带你刷题版)
笔者很好奇,此题不管有什么方法,都会用到起码四个位置的加法比较,笔者不知道为什么会传入这么大的几个数,这样加法是必然过不了的,除非这题也要使用大数加法的计算,而这种题要搞这种是很无语的,日前力扣更新了一下,避免使用long sum存储结果导致逃避大数加法的情况,服。算法思想:左右两个指针依次往内部移动,如果相遇则停止,每一步都计算体积并实时更新,移动方法:移动当前值最小的指针,因为此时内部的数据是固定的,如果容器的宽减小的情况下,容器的长要尽可能长才有超越原来体积的机会,所以我们此时选择让短边的指针移动。原创 2024-05-04 08:37:32 · 971 阅读 · 3 评论 -
数据结构图的创建和遍历(dfs,bfs,附代码)
图的邻接矩阵,邻接表存储,dfs递归非递归,bfs原创 2024-04-30 21:36:36 · 416 阅读 · 5 评论 -
力扣记忆化搜索:最长递增子串
【代码】力扣记忆化搜索:最长递增子串。原创 2024-04-28 18:09:00 · 160 阅读 · 3 评论 -
力扣记忆化搜索:不同路径
2.记忆化搜索就是创建一个表用于记录数据,并且每一步都要操作表,返回也要从表中取。原创 2024-04-28 12:00:35 · 156 阅读 · 3 评论 -
力扣洪水算法:扫雷游戏
【代码】力扣洪水算法:扫雷游戏。原创 2024-04-28 04:13:52 · 156 阅读 · 4 评论 -
力扣洪水算法:太平洋大西洋水流问题
2.此处也运用了正难则反的思想,只找水可以最高到哪里。原创 2024-04-28 03:20:32 · 203 阅读 · 2 评论 -
力扣洪水算法:被围成的区域
2.此题采用了正难则反的思路,直接将靠边的情况单独处理,直接省去了大量的判断代码。原创 2024-04-28 02:20:53 · 195 阅读 · 6 评论 -
力扣洪水算法:岛屿的最大面积
【代码】力扣洪水算法:岛屿的最大面积。原创 2024-04-27 10:47:45 · 147 阅读 · 3 评论 -
力扣洪水算法:岛屿数量
【代码】力扣洪水算法:岛屿数量。原创 2024-04-27 10:12:36 · 201 阅读 · 3 评论 -
力扣洪水算法:图像渲染
【代码】力扣洪水算法:图像渲染。原创 2024-04-27 09:34:42 · 154 阅读 · 3 评论 -
那些年我们一起写过的代码3:回溯剪枝恢复现场
(+=不能用在表达式中)原创 2024-04-26 23:04:01 · 172 阅读 · 3 评论 -
漫话算法:一文带你搞懂递归回溯剪枝恢复现场暴搜
1.在力扣中,我们一般都按标签做题,但是如果没有标签我们如何判断使用什么算法呢,以下是我的看法2.递归:先观察问题的构成,如果符合两种情况,一种是大问题下包含这子问题,而大问题和子问题的解决方法十分相似,二叉树的遍历等算法就是这种类型的递归,另一种是每个子问题都一模一样,深搜相关的算法就是这种类型的递归,dp函数不断向下判断。原创 2024-04-26 19:25:08 · 1077 阅读 · 3 评论