
数据结构
文章平均质量分 79
星*湖
这个作者很懒,什么都没留下…
展开
-
数据结构:平衡二叉树
所以我们可以将三个结点的关键字进行“比较”中间值为根结点,最小值为左子树,最大值为右子树,如图所示。在对查找表{13,24,37,90,53}构建平衡二叉树时,由于符合第4条的规律,所以进行先右旋后左旋的处理,最终由不平衡的二叉排序树转变为平衡二叉树。注意:图 7 中插入结点也可以为结点C的右孩子,则(b)中插入结点的位置还是结点C右孩子,(c)中插入结点的位置为结点A的左孩子。注意:图8中插入结点也可以为结点C的右孩子,则(b)中插入结点的位置改为结点B的左孩子,(c)中插入结点的位置为结点B的左孩子。原创 2023-10-15 15:41:52 · 628 阅读 · 0 评论 -
数据结构:二叉排序树
2)用结点 p 的直接前驱(或直接后继)来代替结点 p ,同时在二叉排序树中对其直接前驱(或直接后继)做删除操作,简单理解:因为p的左子树的最右端s是p的左子树所有结点关键字中最大的,所以只需用其代替p,然后将s的左子树为其父结点的右子树即可。1)令结点 p 的左子树为其双亲结点的左子树;结点 p 的右子树为其自身直接前驱结点的右子树,简单理解:因为p的左子树所有结点都小于p的右子树结点,所以只需将p的左子树重接在p的父结点的左子树上,然后将p的右子树整体接入p左子树的最右端s即可。原创 2023-10-12 17:23:45 · 1099 阅读 · 0 评论 -
数据结构:选择排序
选择排序是一种简单直观的排序算法。首先在未排序序列中找到最大(最小)的元素,存放到排序学列的其实位置,然后在剩余的未排序的元素中寻找最小(最大)元素,存放在已排序序列的后面。原创 2023-08-13 20:04:04 · 773 阅读 · 0 评论 -
数据结构:交换排序
使用起泡排序算法,其时间复杂度同实际表中数据的无序程度有关。若表中记录本身为正序存放,则整个排序过程只需进行。原创 2023-08-10 17:47:23 · 736 阅读 · 0 评论 -
数据结构:插入排序
插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。直接插入排序是插入排序算法中的一种,采用的方法是:在添加新的记录时,使用顺序查找的方式找到其要插入的位置,然后将新记录插入。很多初学者所说的插入排序,实际上指的就是直接插入排序算法,插入排序算法还包括折半插入排序、2-路插入排序,表插入排序和希尔排序等。原创 2023-08-03 20:37:58 · 9644 阅读 · 0 评论 -
数据结构:树的存储结构
学习树之前,我们已经了解了二叉树的顺序存储和链式存储,哪么我们如何来存储普通型的树结构的数据?如下图1:如图1所示,这是一颗普通的树,我们要如何来存储呢?原创 2023-07-29 21:52:01 · 1063 阅读 · 0 评论 -
数据结构:线索二叉树
通过前一节对线索二叉树的学习,其中,在遍历使用中序序列创建的线索二叉树时,对于其中的每个结点,即使没有线索的帮助下,也可以通过中序遍历的规律找到直接前趋和直接后继结点的位置。如果在二叉树中想保存每个结点前趋和后继所在的位置信息,最直接的想法就是改变结点的结构,即添加两个指针域,分别指向该结点的前趋和后继。注意:中序对二叉树进行线索化的过程中,在两个递归函数中间的运行程序,和之前介绍的中序遍历二叉树的输出函数的作用是相同的。线索链表中的“线索”,指的是链表中指向结点前趋和后继的指针。线索二叉树中的结点结构。原创 2023-07-28 21:19:44 · 1063 阅读 · 0 评论 -
数据结构:分块查找
总体来说,分块查找算法的效率介于顺序查找和折半查找之间。由于索引表中显示第二子表的起始位置在查找表的第 7 的位置上,所以从该位置开始进行顺序查找,一直查找到该子表最后一个关键字(一般将查找表进行等分,具体子表个数根据实际情况而定)。分块有序指的是第二个子表中所有关键字都要大于第一个子表中的最大关键字,第三个子表的所有关键字都要大于第二个子表中的最大关键字,依次类推。个子表,对每个子表建立一个索引,索引中包含中两部分内容:该子表部分中最大的关键字以及第一个关键字在总表中的位置,即该子表的起始位置。原创 2023-07-28 20:36:41 · 1099 阅读 · 0 评论 -
数据结构:顺序表
如果对于查找表中各个数据元素有可能被查找的概率提前已知,就应该根据其查找概率的大小对查找表中的数据元素进行适当的调整:被查找概率越大,离查找出发点 i 越近;所以,查找算法的平均查找长度应该为查找成功时的平均查找长度加上查找失败时的平均查找长度。静态查找表用顺序存储结构表示时,顺序查找的查找过程为:从表中的最后一个数据元素开始,逐个同记录的关键字做比较,如果匹配成功,则查找成功;所以查找算法衡量好坏的依据为:查找成功时,查找的关键字和查找表中的数据元素中进行过比较的个数的平均值,称为平均查找长度(原创 2023-07-27 20:07:36 · 383 阅读 · 0 评论 -
数据结构:二叉树遍历
二叉树的遍历是指按照某条搜索路径访问二叉树中的每个结点,使得每个结点均被访问一次,而且仅被访问一次。二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。先序、中序、后序其实值得是父节点被访问的次序。若在遍历过程中,父节点均先于它的子节点被访问,就是先序遍历;若父节点被访问的次序在它的子节点被访问次序之间,就是中序遍历;若访问完左右孩子之后在访问父节点,就是后序遍历。无论是先序遍历、中序遍历还是后序遍历,左右孩子节点的相对访问次序是不会发生变化的,总是先访问左孩子,在访问右孩子节点。原创 2023-07-22 00:17:18 · 401 阅读 · 0 评论 -
数据结构:基本概念
是能输入计算机且能被计算机处理的;信息的载体;是对客观十五符号化的表示;能够呗计算机识别、存储和加工。包括数值型的数据:正数,实数等。非数值型的数据:文字、图像等。:是数据的,在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素有若干个组成,。:是性质相同的数据元素的集合,是数据的一个子集。:描述数据元素之间的逻辑关系。与数据存储无关,独立于计算机;是从具体问题抽象出来的数据模型。:数据元素及其关系在计算机存储器中的结构(存储方式),是数据结构在计算机中的表示。原创 2023-07-11 17:19:49 · 450 阅读 · 0 评论 -
算法基础——枚举
枚举算法是我们在日常中使用最多的一种算法思想,它的核心思想是:枚举所有的可能,确定枚举对象、范围和判定条件;然后注意枚举可能的解并验证每个解是否是问题的解。原创 2023-06-16 12:16:30 · 1167 阅读 · 0 评论 -
排序——选择排序
是指利用堆来实现的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。堆排序的平均时间复杂度为。选择排序是一种简单直观的排序算法。首先在未排序序列中找到最大(最小)的元素,存放到排序学列的其实位置,然后在剩余的未排序的元素中寻找最小(最大)元素,存放在已排序序列的后面。了解了堆的基本性质之后,我们就可以看堆排序的基本思想。原创 2022-11-21 23:54:12 · 101 阅读 · 0 评论 -
排序——交换排序
快速排序是通过多次比较和交换来实现有序的。在一次排序中把将要排序的元素分成两个独立的子数组,其中一个子数组的所有元素全大于另一个组数组的所有元素,然后继续递归排序这两部分。冒泡排序是一种简单直观的排序算法,他重复地查看排序的数列,每次比较两个元素,如果这两个元素的顺序错误就将它们相互交换,直到没有再需要交换。快速排序本质上是可以说是冒泡排序基础上的递归分治法,它也是分治算法在排序算法上的一种经典应用。我们发现每次循环都将最大的元素放在队尾。原创 2022-11-21 23:44:24 · 156 阅读 · 0 评论 -
排序——插入排序
它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。它是在直接插入排序的基础上的一种改进,因为在查找插入位置时没索要查找的序列一定是有序序列,所以我们利用折半二分的思想来优化查找的效率。插入排序的原理类似于打扑克牌,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到响应位置并插入。将待排序序列的第一个元素做为有序序列,吧第二个元素到最后一个元素当成未排序序列。从头到尾一次扫描未排序序列,将扫面的每个元素插入有序序列的适当位置。原创 2022-11-21 23:37:48 · 232 阅读 · 0 评论 -
数据结构:哈夫曼树
哈夫曼树(Huffman)又称之为最优树,是一种带权路径长度最短的树。原创 2022-11-20 17:39:17 · 2545 阅读 · 0 评论 -
队列及其基本概念
队列是一个特殊的线性表,它只允许在表的前端(队头)进行删除操作,在表的后端(队尾)进行插入操作。因此,后进来的元素必须等到先进来的元素全都出队列之后才可以进行操作,所以队列的特征就是先进先出。原创 2022-10-13 20:41:54 · 285 阅读 · 0 评论 -
图——关键路径
在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(完成活动所需要的时间),称之为用边表示活动的网络,简称AOEAOEAOE网。AOEAOEAOE只有在某顶点所代表的事件发生后,从该顶点出发的各活动才能开始。只有在进入某顶点的各活动都结束,该顶点所代表的事件才能发生。我们将AOEAOEAOE网中入度为000的顶点称之为开始顶点或者源点;出度为000的顶点称之为结束顶点或者汇点。正常情况下,AOEAOEAOE网。......原创 2022-08-18 15:27:48 · 273 阅读 · 0 评论 -
拓扑排序算法
在学习拓扑排序之前,我们需要先了解一些基本知识:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足每个顶点出现且仅出现一次;若顶点AAA在序列中排在顶点BBB的前面,则在图中不存在从顶点BBB到顶点AAA的路径时,称该图为拓扑排序例如下图中,首先它必须时有向无环图,从111出发的拓扑排序可以是1,2,4,3,51,2,4,3,51,2,4,3,5。对于一个有向无环图的拓扑排序,我们遵循一种常用的方法:代码实现:在采用邻接表存储的拓扑排序的时间复杂度为O(V+E)O(V+E)O(V+E),采用邻接矩阵原创 2022-08-15 17:18:54 · 972 阅读 · 1 评论 -
图:最短路径—Floyd算法
松弛函数的作用就是判断是否经过某个顶点(边),可以缩短起点到终点的路径权值。算法又称之为费洛伊德算法,是解决给定的有权图中顶点之间的最短路径的一种算法,算法之前,我们先了解一个函数——松弛函数。由核心代码我们可以知道,,对于稠密图,效率高于。基本思想:递推产生一个。...原创 2022-08-10 07:37:28 · 1896 阅读 · 0 评论 -
图的两种遍历
图的遍历是指从图的某个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。原创 2022-08-03 11:34:46 · 331 阅读 · 0 评论 -
图的存储方式
是指用一个一位数组存储图中的顶点信息,用一个二位数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二位数组称为邻接矩阵。空间复杂度为O(n2)O(n^2)O(n2),其中为图的顶点数。有向图,无向图和网的邻接矩阵:注意:无向图的邻接矩阵是对称矩阵,对规模大的邻接矩阵可以采用压缩存储。图的邻接矩阵存储结构定义如下:图的邻接矩阵存储的特点:我们知道一个图的邻接矩阵存储的空间复杂度为O(n2)O(n^2)O(n2),当这个图为稀疏图时,使用邻接矩阵存储将会浪费大量的存储空间,而图的邻接表法结原创 2022-07-28 17:05:14 · 483 阅读 · 0 评论 -
字符串匹配:KMP算法
在暴力匹配算法中,每次匹配失败都是模式串后移一位再从头开始,回溯的步骤太多了。所以我们需要尽量减少回溯的次数。而某些匹配相等的字符序列是模式串的某个前缀,这种重复的比较相当于模式串在进行自我比较。这就需要一个新的匹配方法——KMP算法。......原创 2022-07-19 23:19:43 · 268 阅读 · 0 评论 -
二叉树基础
二叉树是一种树形结构,其每一个结点至多只有两棵子树,并且二叉树的两个子树是有左右之分的,其次序不能任意颠倒。满二叉树一颗高度为hhh,且含有2h−12^h-12h−1个结点的二叉树称之为满二叉树,即除最后一层无任何子结点外,每一层上的所有结点都有两个子结点的二叉树。完全二叉树高度为hhh,有nnn个结点的二叉树,当且仅当其每个结点都与高度为hhh的满二叉树中编号为111到nnn的结点一一对应,则称其为完全二叉树。二叉排序树左子树上所有结点的关键字均小于根结点的关键字;右子树上所有结点的关键字均大于根结点的关原创 2022-07-10 22:14:40 · 167 阅读 · 0 评论 -
树的基本概念
树是n(n≥0)n(n\geq0)n(n≥0)个结点的有限集。当n=0n=0n=0时,称为空树。对于任意一颗非空树应满足:树中一个结点的孩子个数称之为该结点的度,树中结点的最大度数称为树的度。度大于000的结点称为分支结点(又称为非终端结点),度为000的结点称为叶子结点(又称为终端结点)。结点的深度是从根结点开始自顶向下逐层累加的。结点的高度是从叶结点开始自底向上逐层累加的树的高度是树中结点的最大层数。树中结点的各子树从左到右是有次序的,不能互换,称该树为有序树,否则为无序树。树中两个结点之间的路径是由这原创 2022-07-04 16:55:47 · 144 阅读 · 0 评论 -
位 运 算
位运算是基于整数的二进制的运算。计算机内部是以二进制进行存储数据,所以位运算是相当快的。常见的位运算符有:与(&)、或(|)、异或(^)、取反(~)、左移()。 参与运算的两个数据,按二进制位进行“与”运算。 运算规则: 与运算用途: 判断奇偶性(大多数应用) 我们只要根据最后一位是否是0来决定,为0是偶数,为1时奇数 参与运算的两个数据,按二进制位进行“或”运算。 运算规则: 注意:负数按照补码形式参与按位运算 参与运算的两个数据,按二进制位进行“...原创 2022-06-24 09:07:37 · 115 阅读 · 0 评论 -
图论的基础
图论基础原创 2022-06-14 21:20:55 · 319 阅读 · 0 评论 -
线段树
线段树原创 2022-06-14 21:18:12 · 125 阅读 · 0 评论 -
字符串基础
字符串原创 2022-06-14 21:10:05 · 244 阅读 · 0 评论 -
字符串匹配:暴力算法
字符串匹配算法——暴力算法原创 2022-06-11 23:21:34 · 4186 阅读 · 0 评论 -
字典树算法
字典树原创 2022-06-11 23:18:38 · 640 阅读 · 0 评论 -
图:最短路径—Dijkstra算法
在了解DijkstraDijkstraDijkstra算法之前,我们先了解一个函数——松弛函数。松弛函数:对边集合EEE中任意边,以w(u,v)w(u,v)w(u,v)表示顶点uuu出发到顶点vvv的边的权值,以dis[v]dis[v]dis[v]表示从起点到顶点uuu的路径权值。若存在w(u,v)w(u,v)w(u,v),使得dis[v]>dis[u]+w(u,v)dis[v]>dis[u]+w(u,v)dis[v]>dis[u]+w(u,v),则更新d[v]=d[u]+w(u,v)d原创 2022-05-22 20:54:50 · 504 阅读 · 0 评论 -
数据结构:归并排序
归并排序(Mergesort)(Merge sort)(Mergesort)是建立在归并操作上的一种有效排序算法,它是采用分治算法的一个典型的应用。时间复杂度为O(NlogN)O(NlogN)O(NlogN),代价是需要额外的内存空间。算法理解我们可以先看一个图归并排序的思想:我们先对输入数组一直进行对半拆分,直到区间内只有一个元素的时候,一个元素肯定是有序数组,然后我们在依次合并两个有序数组。算法步骤对输入数组进行对半拆分,直到区间内只有一个元素设定两个指针分别两个已经有序序列的起始位置原创 2022-05-19 21:34:03 · 561 阅读 · 0 评论 -
数据结构:链表
链表是一种由节点组成的数据结构,每个节点都包含某些信息以及指向链表中另一个节点的指针。链表的各个节点之间不一定是连续存储的。如果序列中的节点只包含指向后继节点的链接,则该链表称之为单向链表。下面我们来了解链表的基本操作:插入2. 删除下面我们给出单向链表的代码,其中包含:增(头插入、尾插入);删(删除第一个节点、删除最后一个节点,删除指定数据节点);查(查找特定数据是否在链表中),能查既能改。#include <iostream>using namespace std;原创 2022-05-16 20:25:53 · 320 阅读 · 0 评论 -
数据结构——二维树状数组
我们已经学会了对于以为树状数组的常规操作,那么我们好奇(谁没事,这么的无聊)能不能把类似的操作放在矩阵上呢?这里我们就来写二维的树状数组。我们了解了一维树状数组的原理,二维树状数组和一维树状数组类似,在二维树状数组中,arr[x][y]arr[x][y]arr[x][y]记录的是右下角为(x,y)(x,y)(x,y),高度为lowbit(x)lowbit(x)lowbit(x),宽度为lowbit(y)lowbit(y)lowbit(y)的区间和。单点修改+区间查询void updata(int原创 2022-05-14 23:38:50 · 2646 阅读 · 0 评论 -
数据结构——一维树状数组
首先,我们现在需要维护一个一维数组的前缀和,设ans[i]=arr[1]+arr[2]+⋯+arr[i]ans[i] = arr[1]+arr[2]+\cdots+arr[i]ans[i]=arr[1]+arr[2]+⋯+arr[i]。现在如果我们要修改任意一个元素arr[i]arr[i]arr[i]的值,则相关的前缀和ans[i],ans[i+1],⋯ ,ans[n]ans[i],ans[i+1],\cdots,ans[n]ans[i],ans[i+1],⋯,ans[n]都会发生变化。如果我们采用传原创 2022-05-14 23:34:22 · 331 阅读 · 0 评论 -
数据结构:线性表及其顺序存储
线性表的定义线性表是具有相同特性数据元素的一个有限序列。序列中所含元素个数叫做线性表的长度。除了头尾元素,其余元素都只有一个直接前驱和直接后继。线性表的存储结构顺序存储结构(顺序表)原理:把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储位置开始的一块连续的存储空间中(逻辑与物理统一)。优点:空间利用率高。(局部性原理,连续存放,命中率高)存取速度高效,通过下表来直接存储。缺点:插入和删除比较慢不可以增长长度时间复杂度:查找O(1)O(1)O(1),插入和删..原创 2022-05-14 23:19:11 · 263 阅读 · 0 评论 -
数据结构:栈和队列
什么是栈栈(Stack)又称为堆栈,是一种受限制的线性表只允许从一端插入和删除数据。因为栈的插入和删除只能在栈顶进行,所以每次删除的元素都是栈中的最后一个元素,故栈的特征是先进后出。当我们了解了栈是定义和性质之后,我们就可以自己手写一个栈,我们可以用定义长度为NNN的数组SSS来表示,用一个栈指针toptoptop指向栈顶,若top=0top=0top=0,表示栈空,top=Ntop=Ntop=N时,表示栈满。进栈时top++top++top++,出栈时top−−top--top−−。当top<0原创 2022-04-29 20:13:12 · 898 阅读 · 0 评论 -
带权并查集
带权并查集带权并查集区别于普通并查集的是,普通并查集只记录集合元素与集合之间的关系,即改元素是否属于该集合。带权并查集是在普通并查集得到急促上记录每一个元素的权值(本质上是记录该元素相对于根节点的权值),这个权值可以表示集合内元素之间除了链接外的某种关系,这里我们使用val(value)val(value)val(value)记录每个元素的权值。在上面并查集的路径压缩中,如果对节点CCC做find_setfind\_setfind_set操作,最终会得到AAA,但是查找的过程中会先经过BBB,再通过fi原创 2022-04-12 23:44:24 · 796 阅读 · 0 评论 -
并查集基础
并查集是一种将一个集合以树形结构进行组合的数据结构,用于处理一些不相交集合的合并及查询问题。一些常见的用途有求连通子图、求最小生成树的 KruskalKruskalKruskal 算法和求最近公共祖先(Least Common Ancestors,LCALeast\:Common\:Ancestors, LCALeastCommonAncestors,LCA)等。并查集的主要操作有:初始化、合并、查找初始化:将每个元素的父辈设为自己,即自己形成一组void init_set(){ for(int原创 2022-04-12 23:43:06 · 102 阅读 · 0 评论