![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 81
龙星尘
现在正在学硬件和软件编程,用的是C++和Arduino编程工具,以后会发一些关于编程的文章!请大家多多关照!
展开
-
[NOIP2003 提高组] 加分二叉树
如果该题你认真思考的话,熟知树的结构,那是有很大几率可以做出来的。祝大家早日AC!The End~原创 2023-06-08 16:42:42 · 833 阅读 · 1 评论 -
二叉平衡树(C++)
平衡二叉树也叫做AVL树,AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树。我们怎么知道这棵二叉搜索树平不平衡呢?我们知道,二叉搜索树的搜索时间和高度是有直接关系的,但是我们按递增、递减序输入之后,高度就和n一样了,所以时间复杂度为O(log n).想要优化,就是改变这棵二叉搜索树的高度。原创 2023-02-25 19:51:55 · 1051 阅读 · 1 评论 -
二叉查找树(C++)
二叉查找树是什么呢?(也叫二叉搜索树)就是字面意思,首先是一颗二叉树:一棵树,最多分两个叉。1.1 满二叉树上面那个图就是一颗二叉树,同时也是一颗满二叉树:每一个节点都有两个儿子,左儿子和右儿子。同时啊,还有完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。1.2 完全二叉树1.3 普通二叉树。原创 2023-02-21 17:56:33 · 1075 阅读 · 1 评论 -
数据结构——图(3)
数据结构—图(三)、图的遍历 图的遍历和树的遍历类似,希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫图的遍历。 对于图的遍历来说,如何避免因回路陷入死循环,就需要科学地设计遍历方案,通过有两种遍历次序方案:深度优先遍历和广度优先遍历。深度优先: 1.首先访问出发顶点V 2. 依次从V出发搜索V的每个邻接点W; 3. 若W未访问过,则从该点出发继续深度优先遍历;它类似于树的前序遍历。 广度优先: 1.首先原创 2022-10-31 10:48:44 · 154 阅读 · 1 评论 -
数据结构——图(2)
(二)图的存储结构存储结构1.邻接矩阵表示法: 利用一个矩阵来表示图中顶点之间的关系,反映的是顶点间的相邻关系。一个n行n列的矩阵表示由n个顶点的图,如果(i,j)或者属于边集合,则矩阵中第i行j列的值为1,否则为0。图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:例如:的邻接矩阵为看一个实例,下图左就是一个无向图原创 2022-10-31 10:41:38 · 948 阅读 · 1 评论 -
数据结构——图(1)
数据结构—图 图(Graph)是一种比线性表和树更为复杂的数据结构。 线性结构:是研究数据元素之间的一对一关系。在这种结构中,除第一个和最后一个元素外,任何一个元素都有唯一的一个直接前驱和直接后继。 树结构:是研究数据元素之间的一对多的关系。在这种结构中,每个元素对下(层)可以有0个或多个元素相联系,对上(层)只有唯一的一个元素相关,数据元素之间有明显的层次关系。 图结构:是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,原创 2022-10-31 10:36:26 · 1466 阅读 · 1 评论 -
两个队列实现栈
在这里说明一下,假设队列和栈都足够大,不会出现满的情况.实现一:思路:q1是专职进出栈的,q2只是个中转站.入栈:直接入队列q1即可出栈:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中原创 2022-10-30 18:01:35 · 124 阅读 · 1 评论 -
两个栈实现队列
为说明思想,假设队列、栈都很大,不会出现满的情况。思路:s1是入栈的,s2是出栈的。入队列,直接压到s1是就行了出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素;再把s2的所有元素全部压回s1中实现二:思路:s1是入栈的,s2是出栈的。保证所有元素都在一个栈里面入队列时:如果s1为空,把s2中所有的元素倒出压到s1中;否则直接压入s1出队列时:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素比较:与实现一原创 2022-10-30 17:55:02 · 151 阅读 · 1 评论 -
数据结构—栈
栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。换句话说,栈的修改是按先进后出的原则进行的。因此,栈又称为先进后出(FILO)的线性表。在栈中进行插入和删除操作的一端称为栈顶(top),相应地,另一端称为栈底(bottom)。不含数据元素的栈称为空栈。原创 2022-10-28 17:08:02 · 182 阅读 · 1 评论 -
Rainbow的商店
看到了这道题,我第一个想到的不是排序,而是贪心, 于是我就决定先用贪心算法实现,如果实在不行就想一下怎么排序,接下来我就给大家讲我贪心的思路: 贪心比较特殊,要让最大的卖出去,又尽量不能让小的过期,只按照价值排遇到保质期大的大值就会出问题 最后思路是:大的在前,价值一样的话天数少的在前,但其实没有影响 设立vis数组表示某天是不是被占用,从最大的d开始,向前找有没有未占用的天数 然后设立一个结构good,里面是一个物品的利润和过期时间,然后说明一下调用排序的。 之后利用ST原创 2022-10-19 18:46:22 · 197 阅读 · 1 评论 -
Freda的越野跑
这个不就是求正序对嘛,和之前的求逆序对很像哦! 其实这个超过的过程, 就是在模拟基于比较的排序的交换过程,也就是说我们需要做的是记录排序过程中的交换次数。(最直观的就是冒泡排序,速度快的就换到前边,换一次就是超过一个人)注意到相同速度的人后边的不会超过前边的,因此需要一个稳定的排序算法,然后数据范围的限制我们要用O(nlogn)的,那么也就很自然的取选用归并排序了。 需要记录的交换发生在merge左右两个子列的时候,如果在左子列还有剩余的时候先排入一个由子列中的元素的话,就相当于这个右子列的原创 2022-10-18 17:51:52 · 581 阅读 · 1 评论 -
方便记忆的电话号码
思路: 就是基础的字符串处理,然后排序找出重复出现的字符串。另外要考虑的就是数字中有可能出现0,因此需要格式化输出,不足补零。 然后可以写一个函数,求的是输入的字符串里面的每一个字符转化过是什么,如果是数字,我们就可以返回其这个字符串代表的数字“直接-'0’就行了”,如果是一个大写字母,就进行判断,然后返回其对应的数字。原创 2022-10-18 17:24:51 · 815 阅读 · 1 评论 -
超级快排:Ultra-QuickSort
刚开始看到这道题的时候,我就觉得很简单啊,不就是求逆序对吗,于是,我写了一个特殊的bubble(就是冒泡排序,因为要计数,所以不能用STL库里面的sort),果然,超时了!(因为超时过于严重,所以就不发图片了)原创 2022-10-18 17:14:09 · 1480 阅读 · 2 评论 -
DNA排序
这道题和我讲的上一道题一样“求逆序对数”,这道题也是求逆序对数,所以也要用上一道题的归并排序函数(用来求逆序对数量)我们上一道题编是的数字,这道题是字符串,我们就要把函数改了吗? 其实并不需要,因为我们可以新建立一个int数组,存的是输入字符串的int强制转换过的数字(也就是ASCII码),然后放入这个函数中来求逆序对数就行了,然后用一个变量存下来。 因为存字符串的int强制转换的ASCII码用一次就行了,所以不需要一直存下来,就可以写一个局部变量!原创 2022-10-17 18:55:39 · 845 阅读 · 1 评论 -
求逆序对数
首先跟大家讲一下,我最开始的时候的思路,首先输入n和a[1~n],如果n=0就直接break退出了(直接return也是可以的),然后进行双重for循环j=i+1保证ia[j]的话,那么将计数器++,循环过后输出sum就行了。经过了这次的超时,我终于想到了排序,我在想:"连我这个O(nlogn)的时间复杂度都寄了,那么冒泡等排序就肯定不行了,于是我想到了快排和归并还有桶",我是先想效率最快的桶、快排的,但是我实在想不到用快排怎么实现这道题。原创 2022-10-17 17:23:22 · 1293 阅读 · 1 评论 -
牛的选举
大家都看的出来,这是一道排序题目,需要将第一轮投票数的排序(记住是从大到小“题目要求”),然后选出后面n-k个牛,将其的票数清零(因为第二轮还需要排序),然后在根据第二轮的投票数进行排序(自然还是从大到小),选其中最大的数的编号来做总统。 我们如果用普通的排序,是不能通过第二轮找到的最大数来找到这头牛的编号(如果你枚举来判断的话,是可以的“不会出现票数相同的情况”,但是会用掉O(n)的时间),所以我们可以来写一个结构,结构里面要有什么呢? 我们来看题目,有ai和bi还有没头牛的编号,表明这个结构原创 2022-10-17 16:55:25 · 299 阅读 · 1 评论 -
循环双链表的基本操作
1. 尾指针:不是尾结点的指针,是指向尾结点的指针2. 头指针:不是头结点的指针,是指向头结点的指针,无论链表是否为空,头指针均不为空。3. 头结点:放在第一个结点之前的结点(“零结点”),数据域可以不存放东西,也可以存放链表信息(如链表长度)。原创 2022-10-15 08:25:12 · 327 阅读 · 1 评论 -
循环单链表的基本操作
循环链表包括循环单链表和循环双链表循环单链表的结点类型与非循环单链表相同,把非循环单链表改成循环单链表只需要将非循环单链表的尾结点next指针由原来的NULL改为指向头节点,自此就将非循环单链表形成看一个环,从表中的任一结点出发均可找到链表中其他的结点,这就是带头节点的循环单链表。循环单链表的操作与单链表基本一致,差别在于遍历链表时,判别当前指针p是否指向表尾结点的终止条件不同: 单链表:p->next != NULL 循环单链表:p->next != h原创 2022-10-14 21:24:47 · 624 阅读 · 1 评论 -
食物链(升级)
这道题的特殊之处在于对于任意一个并查集,只要告诉你某个节点的物种,你就可以知道所有节点对应的物种。 比如一条长为4的链 甲->乙->丙->丁 ,我们知道乙是A物种。那么甲一定是B物种,因为A只吃B物种,不吃C物种或是自己的同类。同样的丙一定是C物种,丁是B物种。也就是说,每一条链上都是A、B、C物种循环,这也是我们寻找不合逻辑的假话的出发点。我们可以定义数组d[i]表示节点i到根节点距离mod3的结果帮助解题。我们统计谎话的数量,那么我们把谎话这样分类:第一类叫弱智的谎话,包括原创 2022-10-12 21:34:48 · 128 阅读 · 1 评论 -
Cube Stacking
思路: 题意说是有n块砖,编号从1到n,有两种操作,操作一(‘M’)是把含有x编号的那一堆砖放到含有编号y的那一堆砖的上面,操作二(‘C’)是查询编号为x的砖的下面有多少块砖。传统并查集+维护size和deep两个数组,find函数在路径压缩的过程中需要把深度也依次加上,到代表这里的时候就是这个集合的最大深度,合并过程中要先将被合并的个数加到合并别人的集合的深度上去,然后在合并个数,最后将被合并的集合清零。原创 2022-10-11 18:19:17 · 134 阅读 · 0 评论 -
食物链
这道题不难看出是一道用并查集来解决的题目,是相当难的,在洛谷上面是一道提高+/省选-的题目,给大家讲一下这道题的思路吧。思路: 刚开始,输入了n和k,然后输入3个整数,判断第一个整数是1还是2,如果是1的话,首先要判断是不是假的,怎么判断这道题是不是假的呢?第一个判断条件是如果输入的后两个数b和c其中任意一个大于了n的话,就是假话,毕竟动物编号最大才n,你大于n了,就根本没有这个动物了,第二个判断条件就是是否冲突,怎么查是否冲突呢?在这道题里面冲突的意思是,b已经可以吃c了,你把b和c放到同一类,这原创 2022-10-10 17:29:14 · 822 阅读 · 1 评论 -
发现它,抓住它
我们先来讲一下这道题的思路,我们输入之后,首先将1~N这N个数字插入到并查集中,然后如果输入的是‘D’,那么就unionSet进行合并(一个集合内的所有元素代表这些犯罪团伙都不是一个团伙),如果输入的是‘A’,那么进行find函数查找a和b的所在集合,我们就只需要判断他们的所在集合是否相同即可。 如果不相同,代表不确定,输出Not sure yet.,如果a和b的父节点是相同的(代表他们是否是同一个集合),如果相同,就输出In the same gang.,如果不是就输出In different原创 2022-10-09 18:39:14 · 1308 阅读 · 1 评论 -
畅通工程
因为以前讲过,所以我们今天就来运用我之前写的并查集的许多操作,有init初始化操作,insert插入函数,find查找加路径压缩函数,unionSet合并两个集合函数,print输出并查集函数。 这道题,我们怎么运用呢? 根据输入,首先输入了n,就将1到n内所有数字插入并查集中,现在并查集中每个数字都是一个集合,然后输入m组合并操作,每次进行unionSet(a,b)函数操作来合并,合并之后不要忘了运用find函数进行路径压缩算法。 进行了这些操作之后,并查集里面有多个集合,如果只有一原创 2022-10-09 08:00:00 · 183 阅读 · 0 评论 -
并查集的基本操作
1. 定义并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并:即union,合并两个集合;查:即find,判断两个集合是否在同一集合;集:即set,集合。并查集用一个数组father[n]实现,father[i]表示元素i的父亲结点。原创 2022-10-06 18:31:32 · 1125 阅读 · 1 评论 -
[HNOI2003]消防局的设立
所以按照树形DP的常规套路,我们把一棵子树的状态作为一个划分状态的标准。但是一个子树可能还可以向外覆盖点,也有可能有几个点没覆盖。由于覆盖半径是2,对于一棵子树划分5种状态:f{i,0}向上覆盖2个。f{i,1}向上覆盖1个。f{i,2}正好覆盖完子树。f{i,3}覆盖完儿子。f{i,4}覆盖完孙子。需要的消防局数目.原创 2022-10-06 11:54:08 · 164 阅读 · 4 评论 -
优先队列的基本操作
一.优先队列概念了解完队列之后我们来了解一种特殊的队列--优先队列优先队列是一种特殊的队列,相较于队列它的特殊也是功能最强大之处在于能自动排序。二.优先队列的头文件#includeusing namespace std; //命名空间不是头文件三.优先队列的声明优先队列声明的基本格式是:priority_queue 队列名;原创 2022-10-05 17:24:27 · 526 阅读 · 1 评论 -
词典
比较简单的检索题,主要建立一个词典的结构体,然后建立完毕后用sort对外文进行升序排序,查找时直接进行二分查找,速度很快.值得注意的是构造词典时,词典的输入是以一个回车结束,所以可以使用 getchar() 函数来获取输入的第一个字符,如果是'\n',说明词典的输入停止.然后再输入待查找的外文.原创 2022-10-05 11:27:26 · 813 阅读 · 4 评论 -
集合的基本操作
之所以称为集合,就是因为set与数学中的集合一样,存在互异性,也就是每一个元素只允许出现一次。set的特性是:所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。自己写的类型,需要重新定义原创 2022-10-04 18:50:57 · 487 阅读 · 1 评论 -
二叉堆的基本操作
二叉堆也就是一棵完全二叉树。堆顶最大则为大根堆,堆顶最小则为小根堆,这里实现的是小根堆。原创 2022-10-04 16:25:54 · 364 阅读 · 1 评论 -
堆排序
因为堆排序无关乎初始序列是否已经排序已经排序的状态,始终有两部分过程,构建初始的大顶堆的过程时间复杂度为O(n),交换及重建大顶堆的过程中,需要交换n-1次,重建大顶堆的过程根据完全二叉树的性质,[log2(n-1),log2(n-2)...1]逐步递减,近似为nlogn。所以它最好和最坏的情况时间复杂度都是O(nlogn),空间复杂度O(1)原创 2022-10-01 08:00:00 · 480 阅读 · 1 评论 -
希尔排序
希尔排序基本思想:希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分为一组,算法便终止。算法实现:希尔排序需要定义一个增量,这里选择增量为gap=length/2,缩小增量以gap=gap/2的方式,这个增量可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列,这个增量是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。原创 2022-09-30 17:08:07 · 183 阅读 · 1 评论 -
简单选择排序
在上一个文章当中,我讲解了冒泡排序,冒泡排序的时间复杂度是O(N^2),今天,我又给大家介绍一个排序算法“简单选择排序”,顾名思义,我们就是要在数组里面来选择,选择什么呢?如果是想要从小到大排序,就每一次选择最小的数字,反之,就选择最大的数字。 简单选择排序,每一次找一个最小(大)的数,需要O(N)的时间,再加上我们要进行N次找最小(大)的数,所以,我们的时间复杂度为O(N^2)原创 2022-09-30 07:30:00 · 321 阅读 · 1 评论 -
数据结构之双向链表
前天的时候,我学习完了单链表,学习速度直线上升,在这两天内学习了双向链表、循环单链表,今天我就来总结一下双向链表的操作!原创 2022-07-28 18:14:43 · 206 阅读 · 1 评论 -
数据结构之单链表
从这个暑假开始,学完了基本算法的我,已经开启了数据结构之旅,第一个数据结构是“线性表”,分为链式存储结构和顺序存储结构,一个是顺序表(相当于数组),另一个是链表,分为单链表、双向链表、循环链表(用指针来进行和顺序表一样的操作),在这两个之中,顺序表较为简单,链表就是比较绕,很多人可能会忘记些什么。 而我,在这个星期里面,一步一步听课,写代码,学会了关于单链表的许多操作,今天,我就来写一个关于单链表的总结!...原创 2022-07-26 16:51:41 · 737 阅读 · 1 评论