数据结构与算法笔记
文章平均质量分 53
本专栏是我在大二学习数据结构与算法过程中做的一些笔记,示例语言为C语言
小袁拒绝摆烂
没啥特别的。
展开
-
数据结构之基数排序
先把各个数以个位数不同分到不同的队列中如果一个队列多个元素用链表连起来第一趟分配然后进行第一趟收集应为我们想得到递减所以我们从个位数高到低收集然后第二趟分配根据第一趟得到的结果以十位数分配这里注意!因为第一趟按个位分的,所以个位大的应该先入队,这就能保证链表的第一个元素经过n次分配后,他的后n个元素肯定大于链表其他元素的后n个这里的队列6的68>66,当然第三趟分配后又不一样,这就能保证最后的序列有序第二趟收集呗这里最后收集的相当于后两位数的有序排序第三趟分配这原创 2022-11-24 09:18:59 · 350 阅读 · 0 评论 -
数据结构之归并排序
注意奥,原来两个数组要有序这个模式叫二路归并就是对比两个序列,找小的先存呗也有其他路的归并比如四路归并从四个关键字找最小的一个呗我们一般是用二路归并需要将原始序列拆分为多个序列原创 2022-11-24 08:58:25 · 75 阅读 · 0 评论 -
数据结构之希尔排序
在插入排序的基础上,进行完善的算法举个例子如图我们把相距举例为4的两个元素组成一个子表(1和5,2和6,3和7,4和8)对各个子表进行直接插入排序比如对子表2进行直接插入排序13插入到38前,子表3,4也是第一趟处理完然后进行第二趟,会缩小增量d这里是直接除2,d=21 3 5 7变为一组第二趟结果其实上面的操作实现了基本有序的状态最后d=1就和直接插入排序没什么区别了,整个表都是子表呗希尔排序其实d怎么变都可以,只要递减到1即可建议是除2。原创 2022-11-24 08:35:26 · 257 阅读 · 0 评论 -
数据结构之选择排序(堆排序)
选择排序分为两种一个是堆排序一个是简单选择排序。原创 2022-11-23 10:12:50 · 149 阅读 · 0 评论 -
数据结构之快速排序(重点)
算法所需一个基准点左边是比其小的数,右边是比其大的数先使所指的元素作为基准元素low用一个piviot存储49然后进行比遍历操作就是high向左移动(high–),到第一个比piviot小的元素进行一个data[low]=data[high]然后进行low++,找到第一个piviot的赋值给data[high]即可就这样循环最后low=high时正好把piviot存入,左边比它小右边大于等于它接下来我们管左子表和右子表即可右子表。原创 2022-11-22 14:32:40 · 207 阅读 · 0 评论 -
数据结构之插入排序
一种思想我们所在指向位是需要进行插入的数据我们锁指向位置前的数据是被插入的数据组我们根据与前面的数据元素一个个比较来确定插入位置的排序比如现在的76比前面的97小,97进行一个右移,就是赋值给data[4](我这里猜测是76应该是赋给一个变量了),然后在与65比较比65大所以76插入到65和97中间关于最后的49,只把比关键值大的值右移一位所以最开始在7位置上的49最后应该在4位置一般是这种带哨兵模式就是把temp变为data[0]实际元素从data[1]开始存储空间复杂度 O(1)原创 2022-11-22 12:40:17 · 249 阅读 · 0 评论 -
数据结构之散列查找
散列表对应的值可称为hash(哈希值)你可以理解为,散列表就是对应地址的映射,只不过假设x为地址g(x)就是对应的哈希值x一样但是对于的g(x)可能一样这就产生了冲突那么如何处理冲突呢?拉链法这样进行查找的话也可以比如27先代入对应的函数查hash值然后去对应的hash表找对应的值遍历对应位置的链表去对比就ok,如果最后都没有的话,就那个散列表就没有。原创 2022-11-14 17:43:22 · 4160 阅读 · 0 评论 -
数据结构之B树(插入删除操作待更新)
为了更方便的介绍B树我们先复习前面的二叉查找树把他变成m叉树m=5时查找遵循,目标比节点数组内数小的话,找对应数的左孩子,如果比对应的大就找对应节点的下一个数据查找9头节点比9大左孩子,9>5往右走9原创 2022-11-14 16:50:50 · 114 阅读 · 0 评论 -
数据结构之查找(分块查找)
分块查找,块内有序查找22找到第一个大于22的块然后遍历对应位置的数据元素,遍历完,有的话就是有没有的话就查找失败。原创 2022-11-10 15:35:30 · 368 阅读 · 0 评论 -
数据结构之查找(折半查找/二分查找)
首先折半查找又称二分查找只针对于有序顺序表重要思想就是对半分把0号位置给一个low然后顺序表的最高位赋一个high位然后使middle=low+high/2然后比较data[middle]与我们要找的数据的对应大小,大的话就是在middle的右边小的话就是在middle的左边(如果等于的话就查找的就是middle)如果大于middle把low=middle+1如果小于就是high=middle-1重点-查找数据只能出现在[low,high]之间比如图中我们找的是33此时33原创 2022-11-10 14:44:54 · 865 阅读 · 0 评论 -
数据结构之查找(顺序查找)
常用于线性结构实现方法从头到尾哨兵实现从尾向头移查找失败最后也是返回的0查找成功就是返回对应的值效率分为失败和成功的成功的时候每一个元素都是n分之一的概率查找后啊路径从1到n失败的话就是n+1次原创 2022-11-10 09:41:58 · 124 阅读 · 0 评论 -
数据结构之查找(基本概念)
查找表不是新数据结构是我们用于查找的数据类型可以是树或者是图操作评价查找算法ASL平均查找长度举一个简单的例子原创 2022-11-10 09:22:03 · 92 阅读 · 0 评论 -
数据结构之图(关键路径)
关键路径上的活动为关键活动,关键活动时间增加,完成整个工程的最短时间也会延长。原创 2022-11-07 13:54:34 · 135 阅读 · 0 评论 -
数据结构之图(拓扑排序)
有向边表示对于入点要先于出点进行如果有这个环路的的话就不是AOV网,与概念出现矛盾了一句话就是找到AOV网中做事的先后顺序每一个AOV网可能有一个或者多个拓扑排序比如这个栗子也可以先买菜再准备厨具这种存在回路的图是不能进行拓扑排序的奥原创 2022-11-07 11:16:15 · 115 阅读 · 0 评论 -
数据结构之图(有向无环图结构表达式)
第一个图没有环第二个图v0到v4到v3再到v0是一个环所以第二个图不是有向无环图我们学过用树存储表达式但是可能会有重复比如红色的和绿色的我们把绿色的干掉指向一个红的也是这样的结果,不过这种数据结构就编程图了同样的包括单独一个字母也可以这样变成一个真题奥1.所以选A因为单纯的查找太容易漏了所以我们总结出了。原创 2022-11-07 10:51:55 · 282 阅读 · 0 评论 -
数据结构之图(最短路径问题)
两种单源最短路径问题和每队顶点的最短路径问题对应图有不同的解法求不带权图最短路径原来的BFS算法改进求最短路径的就是多加d[]数组和path[]数组d[]数组来记录从顶点到对应节点路径长path[]数组记录每个对应节点的直接前驱节点比如3对应的就是6奥如果是按节点大小顺序入队的话4前驱节点应该是3如果不是的话可能是7看情况看先处理谁了BFS算法的局限不能算带权图最短路径算法定义三个数组第一个数组代表是否找到到其最短路径第二个数组代表目前为止从初始顶点到对应顶点原创 2022-11-05 16:41:14 · 575 阅读 · 0 评论 -
数据结构之图(最小生成树问题)
顶点数n个边数n-1个正好够所有顶点连通例子就是找个边权值之和最小的生成树就是最小生成树最小生成树可能不为1看边的权值还有只有连通图才有生成树如果有多个连通分量的话,只有生成森林。原创 2022-11-05 14:47:43 · 657 阅读 · 0 评论 -
数据结构之图(遍历广度优先BFS和深度优先DFS)
树的广度优先遍历是层序遍历从根节点横着一排一排遍历找与其相邻的节点!找对应节点的孩子图的广度优先遍历也是找对应的连接的节点不过与树不同过程中可能出现重复。原创 2022-11-04 23:06:45 · 1032 阅读 · 0 评论 -
数据结构之图(基本操作)
找x对应y后一个邻接点(x和y必须原本是邻接节点)邻接表的话删除对应行还有其他行里包含对应节点的。邻接表的话遍历对应的数组上的链表看有没有。设置一个bool值来标记是不是空节点。邻接矩阵看对应位置上的元素为不为1。因为常用的只有邻接矩阵和邻接表奥。我们这里就值讲用这两种方式实现的。邻接表的话头插法更时间复杂度更低。有出边节点和入边节点分情况喽。找呗,看有没有对应的元素。出边遍历对应的数组就行。入边的话都要遍历一遍呐。邻接矩阵只需要找一列。邻接矩阵不要移动数组。原创 2022-11-04 22:43:56 · 377 阅读 · 0 评论 -
数据结构之图(存储)
顺序+链式储存类似于树中的孩子表示法有向图无向图的度和有向图的出度是比较好找的(遍历对应节点的链表即可)有向入度的话就把所有的节点的边链表遍历一遍邻接表的表示方式不为1但是邻接矩阵是唯一的奥。原创 2022-11-01 22:35:48 · 218 阅读 · 0 评论 -
数据结构之图(概念)
一个图边集可以是空集,不过顶点集不能是有有向图和无向图两种我们在数据结构课程中只研究简单图奥无向图假设e为无向图的边的数量图的度=2e,一条边共享2个度有向图异曲同工点和点之间的距离,是两个点之间的最短距离非连通图的最多边的情况生成子图:包含原图的所有节点,可以不包含所有边有向图同理在连通的情况下包含尽可能多的边和顶点边尽可能保持的少还要连通边肯定为n-1条因为只要多一条边图就会有回路把图的连通分量单独拿出来然后搞成生成树就是生成森林喽原创 2022-11-01 16:08:58 · 194 阅读 · 0 评论 -
数据结构之平衡二叉树(AVL)
我们重点研究的是平衡二叉树插入新节点后还保持二叉树的平衡找对应的最小不平衡子树,对其作出调整现在问题的重点:如何调整最小不平衡子树。原创 2022-11-01 15:29:24 · 80 阅读 · 0 评论 -
数据结构之二叉排序树
主要是左子树的节点上的值全都小于右子树。原创 2022-11-01 11:17:53 · 182 阅读 · 0 评论 -
数据结构之哈夫曼树
树的带权路径长度只与叶子节点的路径长度的权值有关!!!带权路径长=路径长×权值给定n个叶子节点让我们构造二叉树,其中带权路径长度最小的二叉树叫哈夫曼树对应每一个给定权值的n个叶子节点(比如图中四个叶子节点分别为1 3 4 5)都有一个最小的带权路径长度1 3 4 5的最小就是25所以中间的两个图就是哈夫曼树给定你固定的叶子节点怎么构造?1.挑出对应权值最小的两个节点构成一棵树2.然后吧这棵树的权值算为对应叶子节点权值之和,把这棵树当做一个节点3.再找权值最小的组合就完了4.最后组合成的原创 2022-10-29 21:03:20 · 1451 阅读 · 0 评论 -
数据结构c语言常见空指针问题(Segmentation fault)
起初的话我是在做单链表的实现遇到的这个问题奥后来我进行了调试发现确实不对这里的话L是对应应该删除的的节点这里的话我只考虑了当L是NULL返回false然后我就进行一个替换操作把我传入的节点和后面那个节点交换data但是如图奥所以正确的代码应该是。原创 2022-10-29 16:44:16 · 2023 阅读 · 1 评论 -
数据结构之树3
之前讲的都是一些较为常见的树例如二叉树等等现在讲普通的树和一些更特殊的树。原创 2022-10-25 16:59:27 · 228 阅读 · 0 评论 -
数据结构之线索二叉树
二叉树的性质导致有n+1个空指针域这些空指针域,就可以用来存储,对应节点在对应的前驱和后继来储存这些节点这样的话从数的如何一个节点出发,来推它的中序遍历就看起来更可行了。原创 2022-10-19 12:36:47 · 537 阅读 · 0 评论 -
数据结构之树2
当你的树是完全二叉树时几个基本操作当你的二叉树不是完全二叉树时因为要完成树的基本操作,你只能在对应空间储存而且此时对应是否有自子节点还要根据isEmpty来判断对应节点这样的空间利用率还低所以树的顺序一般来说是不太实用的只适用于完全二叉树所以我们重点看书的链式储存。原创 2022-10-13 23:02:57 · 227 阅读 · 0 评论 -
数据结构之树1
注意:度为2的有序树和二叉树又不同之处度为2的树:节点最高度为2,说明肯定有一个节点度为2(有节点说明肯定不是空树喽)二叉树:树中节点最高度为2,可以没有节点二叉树节点的五种状态。原创 2022-10-13 10:44:51 · 287 阅读 · 0 评论 -
数据结构子KMP算法
比如说下面第7个字符匹配失败,然后把对应的第1-6字符组成一个字符串看这个字符串前缀和对应上面1-6进行匹配一定是看对应的上面串的后缀和下面串的前缀(上面不含头,下面不含尾)最长相等长度哦(就是让下面的往右移直至到第一次相同,就是最长长度,不包含刚开始的时候)如果都不匹配,那就是0+1=1呗一些特殊情况如果一开始就不匹配(第一个位置)那么next[1]固定是0,这个情况下实行i++和j++如果第二个不匹配这个时候其实取1-j-1元素那就是第一个元素就一个元素。原创 2022-10-06 09:15:24 · 243 阅读 · 0 评论 -
数据结构之队列的应用
这个等我学到树回来更新啊。原创 2022-09-25 10:40:51 · 95 阅读 · 0 评论 -
数据结构之栈的应用
计算机找对应的匹配的括号,一定是先把左括号存入,然后在找到第一个右括号的时候会取出最后一次的左括号这不就后进先出吗所以可以把找到左括号认为是一个入栈操作,找到右括号是一个出栈操作然后括号匹配就相当于一个栈操作几种错误情况1.扫描左括号和右括号不匹配左括号和右括号不匹配,一个是小括号,一个是中括号后面的就都不用看了不合法2.进行出栈操作时候,栈空了到对应右中括号的时候,栈中所有的左括号已经取出,没有对应的右括号与他匹配,后面也就不用看了不合法。原创 2022-09-22 09:31:19 · 186 阅读 · 0 评论 -
数据结构之队列
队列:只允许在一端进行插入,在另一端删除的线性表。原创 2022-09-18 11:27:51 · 450 阅读 · 0 评论 -
数据结构之栈
/存放栈中的元素 int top;//栈顶指针(数组下标) } stack , * Lstack;//初始化栈指针,刚开始0位置没有元素所以先设成-1 }10//存放栈中的元素 int top;//栈顶指针(数组下标) } stack , * Lstack;//初始化栈指针,刚开始0位置没有元素所以先设成-1 }我的代码和他的不同因为我是纯c需要把引用转为指针。原创 2022-09-15 09:37:21 · 100 阅读 · 0 评论 -
数据结构-双链表、循环链表、静态链表(c语言版)
双链表对比与单链表多一个结构体指针指向前一个节点piror指针指向前一个节点这里我只写后插操作的代码因为位序插入的代码可以通过找到i-1的节点然后进行后插操作来完成删除P节点的后继节点双链表的遍历所谓循环链表就是把最后一个节点的的next指向第一个节点如图这样给其中的任一个节点就能遍历整个链表初始化初始化图示因为循环链表不存在说next指向NULL的情况所以不用考虑NULL指针异常的情况系统申请一片连续空间一个节点存储一个数据和下一个数据的游标(底层是根据原创 2022-09-12 15:45:59 · 310 阅读 · 0 评论 -
数据结构之单链表(c语言版)
关于typedef与结构体此时的LNode *等价于LinkList上下两种效果相同上面解释相当于*LinkList=LNode(LinkList取值是LNode)也就是LinkList=struct LNode *p(LinkList是结构体的指针)不同的对应用于上面位置最好。原创 2022-09-08 09:56:21 · 452 阅读 · 0 评论 -
数据结构之线性表的顺序表(c语言)
及里面的InitList函数i ++) {} //数据的初始化 L . length = 0;//length用来记录我们存储的数据,便于循环操作有价值的(我们定义的)数据 }原创 2022-09-01 20:15:14 · 483 阅读 · 0 评论