![](https://img-blog.csdnimg.cn/bacb6c8527fd4aaca6b915f9bce48ed3.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Data Structure
文章平均质量分 61
数据结构是抽象的表示数据的方式;算法则是计算的一系列有效、通用的步骤。算法与数据结构是程序设计中相辅相成的两个方面,是计算机学科的重要基石。
aiguangyuan
要全身心的投入,程序才会有些感觉!
展开
-
常见的限流方式
什么是限流呢?限流是限制到达系统的并发请求数量,保证系统能够正常响应部分用户请求,而对于超过限制的流量,则通过拒绝服务的方式保证整体系统的可用性。根据限流作用范围,可以分为单机限流和分布式限流;根据限流方式,又分为计数器、滑动窗口、漏桶和令牌桶限流,下面我们对这块详细进行讲解。...原创 2022-07-25 14:20:58 · 2927 阅读 · 1 评论 -
数据结构与算法-十大排序算法(动画演示)
排序算法的概念1. 算法相关名词稳定:如果a原本在b前面,而a = b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a = b,排序之后 a 可能会出现在 b 的后面。时间复杂度:排序时数据总的操作次数所用的时间规模。空间复杂度:排序时在计算机内执行所需的临时存储空间。2. 排序算法分类比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以.原创 2020-06-17 10:08:23 · 2045 阅读 · 0 评论 -
数据结构与算法-散列表
无论是顺序表还是树表,查找数据元素时要进行一系列的键值比较的过程,为了减少比较次数,就需要使数据元素的存储位置和键值之间建立某种联系,为此我们就需要使用散列技术动态查找表。首先我们需要熟悉几个基本一概念:1. 散列函数-数据元素的键值和存储位置之间建立的对应关系。2. 散列表-用键值通过散列函数获取存储位置的这种存储方式构造的存储结构。3. 散列地址-由散列函数决定数据元素的存储位置,该位置 称为散列地址。4. 散列查找-给定关键字,由散列函数进行转换在表中的地址,查看该位置上有无欲查的元素原创 2020-06-09 18:11:42 · 1989 阅读 · 0 评论 -
数据结构与算法-二叉排序树
一棵二叉排序树(Binary Sort Tree)(又称二叉查找树)或者是一棵空二叉树,或者是具有下列性质的二叉树:1. 若它的左子树不空,则左子树上所有结点的键值均小于它的根结点键值;2. 若它的右子树不空,则右子树上所有结点的键值均大于它的根结点键值; 3. 根的左、右子树也分别为二叉排序树。由上图可知,二叉排序树是一棵特殊的二叉树,由于它的特殊性质,中序遍历一棵二叉排序树所得的结点访问序列是键值的递增序列。二叉树的二叉链表类型定义如下:typedef struct btn原创 2020-06-09 12:02:06 · 682 阅读 · 0 评论 -
数据结构与算法-静态查找表
顺序查找顺序表的结构定义如下:// 静态表的表长const int Maxsize = 20;typedef struct { // 关键字 KeyType key;}TableElm;typedef struct { TableElm elm[Maxsize +1]; // 最后一个元素的下标 int n;}SqTable静态查找表中数组的第0个单元,用于设置“岗哨”,以便简化查找运算的实现,数据存放在数组的第1到第n个单元中,第n+1原创 2020-06-08 22:50:20 · 1422 阅读 · 0 评论 -
数据结构与算法-查找
查找就是从大量的数据元素中找出指定的数据元素。在学习查找之前,我们必须先知道一些相关的概念。1. 查找表由同一类型的数据元素(或记录)构成的集合。2.关键字(键)用来标识数据元素的数据项称为关键字,简称键,其值称为键值。3. 主关键字可唯一标识各个数据元素的关键字。4.查找根据给定的某个值,在查找表寻找一个其键值等于它数据元素。5. 静态查找表查找数据时进行的是引用型运算。6. 动态查找表查找数据时进行的是加工型运算。从下一篇开始,将分别介绍静态查找与..原创 2020-06-08 17:50:58 · 265 阅读 · 0 评论 -
数据结构与算法-拓扑排序
在工程实践中,一个工程往往由若干个子项目组成,这些子项目中往往有两种关系。1. 先后关系,即必须在一个子项目完成后,才能开始实施另一个子项目。2. 子项目间无关系,即两个子项目可以同时进行,互不影响。为了保证总项目的顺利进行,必须要对这些子项目进行一定的先后顺序规化,为了解决这类问题,我们可以采用拓扑排序的方法。1. AOV网工程或者某种流程可以分为若干个小的工程或阶段,这些小的工程或阶段就称为活动。如果以图中的顶点来表示活动,有向边表示活动之间的优先关系,这种用顶点表示的活动有向图称为原创 2020-06-07 20:49:41 · 1805 阅读 · 0 评论 -
数据结构与算法-求最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径,它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。算法步骤1. 初始时,引进两个集合S和U,S只包含起点s,U包含除s外的其他顶点,且U中顶点的距离为起点s到该顶点的距离;2. 从U中选出距离最短的顶点k,并将顶点k加入到S中,同时,将从U中移除顶点k;3. 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利原创 2020-06-07 20:48:19 · 1613 阅读 · 0 评论 -
数据结构与算法-最小生成树之克鲁斯卡尔(Kruskal)算法
算法步骤1. 设G = ( V,E ),令最小生成树初始状态为只有n个顶点而无边的非联通图 T=( V,{ } ),每个顶点自成一个连通分量;2. 在E中选取权值最小的边,若该边依附的顶点落在T中不同的连通分量上,且不构成回路,则将此边加入到T 中,否则,舍去此边,选取下一条权值最小的边;3. 以此类推,重复第2步,直至T中所有顶点都在同一连通分量上为止。算法实例假设现在我们已经通过邻接矩阵得到了边集数组并按权值从小到大排列如下图。未完待续。。。......原创 2020-06-05 23:04:23 · 1265 阅读 · 0 评论 -
数据结构与算法-最小生成树之普里姆(Prim)算法
算法步骤设 G=(V,E) 是一个无向带权图,生成的最小生成树为 MinT= (V,T),其中V为顶点的集合,T为边的集合,求T的步骤如下:1.初始化U={u0},T={ },其中U为一个新设置的顶点的集合,初始U中只含有顶点u0,这里假设在构造最小生成树时,从顶点u0 出发;2.对所有点u属于U集合,点v属于(V减U)集合,两点所构成的边(u,v)中,找一条权最小的边(u',v'),将这条边加入到集合T中,将顶点v' 加入到集合U中;3.如果U=V,则算法结束,否则重复以上步骤。最后...原创 2020-06-05 22:16:35 · 1713 阅读 · 0 评论 -
数据结构与算法-图的应用
生成树的定义设连通图G=(V,E),从任一顶点遍历,则图中边分成两部分:E(G) = T(G)+ B(G),T(G)为遍历通过的边,B(G)为遍历时未通过的边,G’(V,T)为G的子图,称之为G的一棵生成树。生成树分为 深度优先生成树 和 广度优先生成树。注意:1.图的生成树不是唯一的。2.生成树G’是图G的极小连通子图。即V(G)=V(G’),G’是连通的,且在G的所有连通子图中边数最少(n个顶点,n-1条 边)。最小生成树1. 问题的起源城市架设通讯网,网中...原创 2020-06-03 14:44:20 · 499 阅读 · 0 评论 -
数据结构与算法-图的遍历
图的遍历即为从图G中某一顶点v出发,顺序访问各顶点一次。为克服顶点的重复访问,设立辅助数组visited[],若visited[i]为1,代表顶点已被访问过,若为0,代表顶点i未被访问过。深度优先搜索法(DFS)从图G(V,E)中任一顶点Vi开始,首先访问Vi,然后访问Vi的任一未访问过的邻接点Vj,再以Vj为新的出发点继续进行深度优先搜索,直到所有顶点都被访问过。搜索到达某个顶点时(图中仍有顶点未被访问),如果这个顶点的所有邻接点都被访问过,那么搜索就要回到前一 个被访问过的顶点,再从该顶原创 2020-06-02 19:40:40 · 870 阅读 · 0 评论 -
数据结构与算法-图的存储结构
图的存储结构分为邻接矩阵和邻接表两种。邻接矩阵1.图的邻接矩阵图的邻接矩阵为表示图的各顶点之间关系的矩阵。设G=(V,E)是n个顶点的图,则G的邻接矩阵用n阶方阵G表示,若(Vi ,Vj )或< Vi ,Vj >属于E(G),则G[i][j]为1,否则为0。通过观察图与邻接矩阵的关系,我们可以得出以下结论。1.无向图的邻接矩阵是对称的。因为(Vi ,Vj )属于E(G),则 (Vj ,Vi)亦属于E(G)。2.从邻接矩阵容易判断任意两顶点间是否有边相联,容....原创 2020-06-02 15:37:32 · 1568 阅读 · 0 评论 -
数据结构与算法-图
图的定义图G是由集合V和E组成,记成 G =(V,E)。其中:V为顶点集,不可为空;E为边集,可为空。边是顶点的有序对或无序对,它反映了两顶点之间的关系。(1). 有向图:边是顶点的有序对的图。(图中每条边都用箭头指明了方向)(2).无向图:边是顶点的无序对的图。图的基本术语1.顶点(Vertex):图中的数据元素。2.弧:有向图中,顶点 Vi 到顶点 Vj 的边,记作<Vi,Vj>,Vj为弧头箭头端;Vi弧尾无箭头端。3.完全图(1).无向完......原创 2020-06-02 11:00:47 · 692 阅读 · 0 评论 -
数据结构与算法 -判定树和哈夫曼树
分类与判定树判定树是用于描述分类过程的二叉 树,每个非终端结点包含一个条件,对应一次比较;每个终端结点 包含一个种类标记, 对应于一种分类结果。设有n个学生,现要根据他们的成绩将其划分为5类:第一类:小于60分,不及格,学生概率为5%;第二类:大于等于60分,但小于70分,及格,学生概率为15%;第三类:大于等于70分,但小于80分,中等,学生概率为40%;第四类:大于等于80分,但小于90分,良好,学生概率为30%;第五类:大于等于90分,优秀,学生概率为10%;若按顺序判原创 2020-06-01 20:27:41 · 6118 阅读 · 0 评论 -
数据结构与算法 -树和森林
树的存储结构1.双亲表示法以一组连续空间存储树的结点,即一个一维数组构成,数组每个分量包含两个域:数据域和双亲域。数据域用于存储树上一个结点的数据元素值,双亲域用于存储本结点的双亲结点在数组中的序号(下标值),根结点没有双亲,双亲域的值为-1。双亲链表的类型定义如下:#define size 10;typedef struct{ datatype data; int parent;} Node;Node slist[size];由树可以转化为双亲表示法.原创 2020-06-01 17:14:58 · 749 阅读 · 0 评论 -
数据结构与算法 -二叉树的遍历
在二叉树的一些应用中,常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理,这就需要对二叉树进行遍历。遍历二叉树是指按某种次序访问二叉树上的 所有结点,使每个结点被访问一次且仅被访问一次。遍历规则与算法由二叉树的定义得知,二叉树的三个基本组成单元是:根结点、 左子树和右子树,设L为左子树,D为根结点,R 为右子树,则存在以下三种遍历规则。1.先序遍历DLR ,首先访问根结点,其次遍历根的左子树,最后遍历根右子树,对每棵子树同样按 这三步(先根、后左、再右)进行。算法.原创 2020-06-01 12:12:40 · 1746 阅读 · 0 评论 -
数据结构与算法 -二叉树的存储结构
二叉树的存储结构主要分为顺序存储结构和链式存储结构。顺序存储结构它是用一组连续的存储单元存储二叉树的数据元素,因此,必须把二叉树的所有结点安排成为一个恰当的序列。为了在这个序列中的能反映出结点相互位置之间的逻辑关系,可用编号的方法,即对二叉树按完全二叉树进行编号,然后用一维数组存储,其中编号 为i的结点存储在数组中下标为i的分量中,该方法称为“以编号为地址”策略,该策略会从树根起,自上层至下层,每层自左至右的给所有结点编号。该策略的缺点是有可能对存储空间造成极大的浪费,在最坏的情况下,一个深原创 2020-06-01 09:13:34 · 1169 阅读 · 0 评论 -
数据结构与算法 -二叉树
二叉树在树结构的应用中起着非常重要的作用,因为二叉树有许多良好的性质和简单的物理表示,而任何树都可以与二叉树相互转换,这样就解决了树的存储结构及其运算中存在的复杂性。二叉树的基本概念1. 定义二叉树是递归的一种表现形式,它是n(n>=0)个结点的有限集合。通常是由一个根及两棵互不相交的左子树和右子树组成,其中左子树和右子树也均为二叉树。此外,二叉树可以是空集合, 根也可以有空的左子树或空的右子树。2.特点(1). 二叉树可以是空的,称空二叉树。(2). 每个结点最多..原创 2020-05-31 11:22:18 · 766 阅读 · 0 评论 -
数据结构与算法 -树
树型结构是一类重要的非线性结构,树型结构是结点之间有分支, 并且具有层次关系的结构,它非常类似于自然界中的树。树结构在客观世界中是大量存在的,例如家谱、行政组织机构都可用树形象地表示。 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构;在数据库系统中,可用树来组织信息;在分析算法的行为时,可用树来描述其执行过程等等。树的定义树是n(n>=0)个结点的有限集,递归是树的固有特性。当n=0时,称为空树。当n>0时,有且仅有一个特定的称为根的结点;其余的结原创 2020-05-31 08:25:22 · 610 阅读 · 0 评论 -
数据结构与算法 -数组
数组可看成是一种特殊的线性表,其特殊在于表中的数组元素本身也是一种线性表。数组的逻辑结构和运算数组它是线性表的推广,其每个元素由一个值和一 组下标组成,其中下标个数称为数组的维数。数组是我们最熟悉的数据类型,在早期的高级语言中,数组是唯 一可供使用的数据类型。由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和下界,因此,数组的处理比其它复杂的结构更为简单,多维数组也是线性表的一种延伸。上图所示的二维数组Amn可以看成是由m个行向量组成的向量, 也可以看成是n个列向量组原创 2020-05-30 11:01:38 · 988 阅读 · 0 评论 -
数据结构与算法 -链式队列
链式队列是用链表表示的队列,它是限制仅 在表头删除和表尾插入的单链表。显然仅有单链表的头指针不便于在表尾做插入操作,为此再增加一个尾指针,指向链表的最后一个结点。头指针front:指向表头结点,队头元素结点为front->next 。尾指针 rear:指向链表的最后一个结点(即队尾结点)。链式队列上溢:可不考虑,因动态申请空间。链式队列下溢:当链式队列为空时,还要求出队,此时链表中无实在结点,此时rear指针也指向表头结点。队列下溢条件: LQ.front->next==原创 2020-05-30 10:31:45 · 976 阅读 · 0 评论 -
数据结构与算法 -循环队列
循环队列为队列分配一块存储空间(数组表示),并将这一块存储空间看成头尾相连接的。头指针front:顺时针方向落后于实际队头元素一个位置。尾指针rear:指向实际队尾元素。 下溢条件:CQ.front==CQ.rear ......原创 2020-05-30 09:41:44 · 520 阅读 · 0 评论 -
数据结构与算法 -顺序队列
顺序队列用一维数组表示它的存储结构。队头指针 front 始终指向实际队头元素的前一位置,队尾指针 rear 始终指向实际队尾元素。初始情况下:front=rear=0;进队列时: rear增1,元素插入尾指针所指位置;出队列进: front增1,取头指针所指位置元素。.....................原创 2020-05-29 19:50:35 · 413 阅读 · 0 评论 -
数据结构与算法 -队列
队列是只允许在表的一端进行插入,而在另一 端进行删除的线性表,也是一种运算受限的线性表。允许删除的一端称为队头(front),允许插入的另一端称为队尾(rear)。例如:排队购物,操作系统中的作业排队。先进入队列的成员总是先离开 队列,因此队列亦称作先进先出(First In First Out)的线性表,简称FIFO 表。当队列中没有元素时称为空队列。在空队列中依次加入元素a1,a2,…an 之后,a1是队头元素,an是队尾元素。显然退出队列的次序也只能是 a1,a2,…an ,也就是说队列的原创 2020-05-29 18:58:28 · 327 阅读 · 0 评论 -
数据结构与算法 -链栈及其相关算法
链栈的定义栈的链式存储结构称为链栈,它是运算受限的单链表, 插入和删除操作仅限制在表头位置上进行,栈顶指针就是链表的头指针。链式栈的类型说明如下:typedef struct node{ DataType data; struct node *next} LkStk;LS->next==NULL为下溢条件,不考虑栈满(上溢)现象。链栈的基本运算1.初始化void InitStack(LkStk *LS){ LS=(LkStk *)ma..原创 2020-05-29 18:20:24 · 964 阅读 · 0 评论 -
数据结构与算法 -顺序栈及其相关算法
顺序栈及常用名词1.顺序栈-即栈的顺序实现。2.栈容量-栈中可存放的最大元素个数。3.栈顶指针 top-指示当前栈顶元素在栈中的位置。4. 栈空-栈中无元素时,表示栈空;5.栈满-数组空间已被占满时,称栈满;6.下溢-当栈空时,再要求作出栈运算,则称“下溢”;7.上溢-当栈满时,再要求作进栈运算,则称“上溢”。顺序栈的类型定义const int maxsize=6;typedef struct seqstack { DataType da......原创 2020-05-29 17:34:03 · 1023 阅读 · 0 评论 -
数据结构与算法 -栈
栈是只能在表的一端(表尾)进行插入和 删除 的线性表,允许插入及删除的一端(表尾)称为栈顶(Top),另一端(表头)称为栈底(Bottom),当表中没有元素时称为空栈。进栈为在栈顶插入一个元素,出栈为在栈顶删除一个元素。栈的特点是后进先出,栈中元素按a1,a2,a3,…an的次序进栈,出栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的,因此,栈称为后进先出线性表(LIFO)。栈的基本运算如下:1. 初始化栈:InitStack(S);2. 判栈空:EmptyS.原创 2020-05-29 16:47:53 · 386 阅读 · 0 评论 -
数据结构与算法 -线性表顺序存储与链式存储的比较
前端几篇分别介绍了线性表中顺序存储与链式存储,下面来总结一下他们的区别。顺序表与链表的优缺点:1. 单链表的每个结点包括数据域与指针域,指针域需要占用额外空间。2. 从整体考虑,顺序表要预分配存储空间,如果预先分配得过大,将造成 浪费,若分配得过小,又将发生上溢;单链表不需要预先分配空间,只要内存空间没有耗尽,单链表中的结点个数就没有限制。顺序表与链表的时间性能:......原创 2020-05-29 16:17:27 · 894 阅读 · 0 评论 -
数据结构与算法 -线性表链式存储及其相关算法
用链接方式存储的线性表简称为链表。链表的具体存储用一组任意的存储单元来存放,链表中结点的逻辑次序和物理次序不一定相同,还必须存储指示其后继结点的地址信息。单链表单链表的结点分为 data 域和 next 域,data域用于存放结点值的数据,next域用于存放结点的直接后继地址的指针域。所有结点通过指针链接而组成单链表, Head称为头指针变量,存放链表中第一个结点地址,NULL称为空指针,一般为最后一个节点的next指针域。我们常常只注重结点间的逻辑顺序,不关心每个结点的实际位置,.原创 2020-05-28 20:20:21 · 2059 阅读 · 0 评论 -
数据结构与算法 -线性表顺序存储及其相关算法
线性表的基本运算操作主要有以下6种:1.初始化 Initiate(L),建立一个空表L=(),L不含数据元素。2. 求表长度 Length(L),返回线性表L的长度。3.取表元 Get(L,i),返回线性表第i个数据元素,当i不满足 1≤i≤Length(L)时,返回一特殊值。4. 定位 Locate(L,x),查找线性表中数据元素值等于x的结点序号,若有多个数据元素值与x相等,运算结果为这些结点中序号的最小值,若找不到该结点,则运算结果为0。5.插入 Insert(L,x,i),...原创 2020-05-28 17:54:17 · 1555 阅读 · 0 评论 -
数据结构与算法 -线性表
线性表是由n(n≥0)个数据元素(结点)组成的有限序列。线性表中只有一个起始结点,一个终端结点, 起始结点没有直接前驱,有一个直接后继。 终端结点有一个直接前驱,没有直接后继。 除此二结点外,每个结点都有且只有一个直接前驱 和一个直接后继。线性表顺序存储的方法是:将表中的结点依次存放在计算机内存中一组连续的存储单元中,数据元素在线性表中的邻接关系决定它们在存储空间中的存储位置,即逻辑结构中相邻的结点其存储位置也相邻。用顺序存储实现的线性表称为顺序表,一般使用数组来表示顺序表。顺序存储线性表时,需原创 2020-05-28 16:37:22 · 771 阅读 · 0 评论 -
数据结构与算法-概述
数据结构(Data structure)是指一组相互 之间存在一种或多种特定关系的数据的组织方式和它们在计算机内的存储方式,以及定义在该组数据上的一组操作。数据组织的三个层次:1. 数据(Data):所有能被计算机处理的符号的集合。2. 数据元素(Data Element):是数据这个集合中的一个个体,即数据的基本单位。3. 数据项(Data Item):数据元素常常还可分为若干个数据项,数据项是数据具有意义的最小单位。在数据库中数据项又称为字段或域,它是数据的不可分割的最小标识单位。.原创 2020-05-28 11:57:53 · 573 阅读 · 0 评论