自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 【数据结构】图的存储

define MaxVertexnum 100 //最大顶点数//顶点数据类型//边数据类型typedef struct { //邻接矩阵定义//顶点表//边表//顶点数与边数}MGraph;#define MaxVertexNum 100 //顶点数typedef struct ANode{ //边表节点int adjvex;//这里因为顶点数据用数组存储,可以用数组下标int型表示而不用char//指针域}ANode;

2025-04-06 12:33:26 881

原创 【数据结构】图的基本概念

通俗来说一堆顶点被一堆线连在一起,这一坨顶点与线的集合就是图。图的严格定义如下:图G由顶点集 和边集 E组成,记为 G=(V,E),其中 V(G)表示图 G中顶点的有限非空集;E(G)表示图 G中顶点之间的关系(边)集合。若V={v1,v2...,vn},则用表示图G中顶点的个数,E={(u,v)|uV,vV},用表示图G中边的条数。

2025-04-02 12:05:05 552

原创 【数据结构】并查集

查询操作指的是给定一个x,能够找到x所属集合的标志节点,即根节点。而合并操作指的是给定两个集合,需要把其中一个集合并到另一个集合里,即把一个集合的根节点连到另一个集合的根节点。由上可以知道并查集的操作针对的元素主要是每个集合的标志节点,即根节点,所以使用树的双亲表示法来表示并查集会显得很方便。而对于Find的优化,可以知道如果所有的集合都只有两层(根节点和其他节点),那么查询的时间复杂度会大大下降。并查集就是拥有合并和查询功能的集合的集合。是一个增长极其缓慢的函数,对于常见的正整数 n,通常。

2025-03-29 17:15:52 583

原创 【数据结构】树与森林

这种存储结构采用一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针,指示其双亲结点在数组中的位置,根结点下标为0,其伪指针域为-1。

2025-03-29 16:24:06 843

原创 【数据结构】一文看懂二叉树的存储与遍历

就能够避免这种循环。而这种后入后出(迟到早退(bushi)的原则符合栈的特性。所以这里我们设立一个栈,将访问过的所有节点按次序入栈,

2025-03-18 20:41:40 1169

原创 【数据结构】哈夫曼编码与哈夫曼树

同时注意我这里将哈夫曼树的左树枝置为0,右树枝置为1,你当然也可以左置1右置0,这样生成的哈夫曼树也不一样。此时如果令这个二叉树的左边为'0',右边为'1',并且令根节点到达某个字符代表的叶节点的路径为其编码,则得到的编码序列就能够同时满足短且不产生歧义的两个要求。首先根据前缀的定义,当我们把待编码的所有字符的编码长度都设定成一样的,那么自然就不会出现互为前缀的情况了。从树的根到一个结点的路径长度与该结点上权值的乘积,称为该结点的带权路径长度。原因很简单,就是被编码的字符中出现了某一个字符是另一个字符的。

2025-03-13 21:24:12 812

原创 【数据结构】树与二叉树的基本概念和性质

树是一种由n个结点(n≥0)组成的有限集合。若n=0,则该树为空树。对于任意一棵非空树,需满足以下条件:首先,存在且仅存在一个特殊的结点,被称为根结点;其次,当n>1时,除根结点外的其余结点可以划分为m个(m>0)互不相交的有限集合T₁、T₂、……、Tₘ,每个集合本身也是一棵树,且被称作根结点的子树。通俗来讲,树中的结点只能有一个父节点,但是能有很多个子节点。二叉树是一种特殊的树形结构,其特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。

2025-03-13 19:39:37 868

原创 【数据结构】矩阵与数组

在这里如果按行优先方式存储元素,则可以看出当i>2时,即从第三行开始,前i-1行的元素个数为3*(i-2)+2个(第一行2个,其他行3个),第i行的元素个数则为j-i+2个(如果处于对角线,则j-i=0,包括自己刚好有两个元素;,则称这样的矩阵为对称矩阵。对于这样的矩阵,我们只需要存储矩阵的下三角或者上三角元素,另一三角的元素只需将i,j互换即可得到。(i>=j),则前i-1行共有1+2+...+(i-1)=i(i-1)/2个元素,第i行共有j个元素,又由于数组下标从0开始,所以再减去1,得到下标为。

2025-03-10 15:08:47 871

原创 【数据结构】队列的基本概念与操作

部分教材上将顺序队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上视为一个环,称为循环队列。当指针到达队列末端,且还要再将一个元素入队时,将指针重置为数组的第一位,也就是跟个圆圈一样将数组头尾相连。要实现这样的操作,可以使用计算机里专门的操作符——求余运算(%)实现。当队首指针需要进1时,令Q.front=(Q.front+1)%MaxSize;当队尾指针需要进1时,令Q.rear=(Q.rear+1)%MaxSize。但有一个问题是,按照上面这种方式,队满队空时Q.front都==Q.rear。

2025-03-09 19:34:50 697

原创 【数据结构】一文看懂前、中、后缀表达式的转换

前中后缀表达式转换:手算方法、栈的的实现、树的实现

2025-03-09 13:47:21 1066

原创 【数据结构】KMP算法保姆级教程

包你看懂kmp算法的实现与底层逻辑

2025-03-08 15:41:46 1083

原创 【数据结构】栈与卡特兰数(详细)

卡特兰数推导与栈的关系

2025-02-28 21:18:08 782

原创 【数据结构】栈的基本概念和操作

如前面所提,栈是操作受限的线性表,那么理论上在计算机里栈也有两种存储方式:顺序存取与链式存取。//数据域int top;//栈顶位置}SqStack;//别名可以预见的是,顺序栈如果存储的数据超限,则会发生内存溢出(上溢);但如果存储的数据不满,又会造成空间的浪费。由于栈底的位置不会改变,这里提出一个共享栈的概念,即将两个栈设置在一个共享空间的左右两头,栈顶往共享空间的中间延伸,如下图所示:图3 共享栈的结构这种存储方式可以极大节省存储空间,同时一定程度避免栈的上溢。

2025-02-28 19:45:57 412

原创 【数据结构】链表的基本概念和操作

int data;//数据域//指针域//别名这里*LinkList表示LNode结构体的指针别名,LinkList p等同于LNode *p。并且要注意指针域next是LNode型。通过结点定义可以看出来链表与顺序表的不同之处:顺序表定义时定义的是一整个顺序表,一整个表就是一个结构体;而链表定义时结构体为一个结点而不是一串链表,结构体之间通过指针相连。int data;//定义前驱后继指针。

2025-02-08 16:18:31 917 1

原创 【数据结构】顺序表相关例题(部分)

观察可以得到,如果把数组的前p位假设为数组a,后n-p位假设为数组b,则移动p位等同于将ab变为ba。解法1:创建一个长度为p的临时数组P,将原数组的前p位元素先存进P里,再将原数组的后n-p位元素向左移动p位,最后把P里的p个元素放回数组末尾。若遇到值为x的元素,则k加1,顺序表长度-1;题目:对长度为 n的顺序表L,编写一个时间复杂度为 O(n)、空间复杂度为 O(1)的算法,该算法删除顺序表中所有值为x的数据元素。题目:设计一个算法,将顺序表L中的一段连续元素逆置,要求算法的空间复杂度为O(1)。

2025-02-06 16:14:36 358

原创 【数据结构】顺序表基本概念和操作

静态定义通过数组给出顺序表的最大长度,在操作上比较方便。但是如果需要存储的数过顺序表的最大长度,发生内存溢出,会导致程序崩溃。#define MaxSize 50 //宏定义数组长度(方便后续修改)typedef struct{ //定义结构体//定义用于储存数据的静态数组int length;//定义已存储的数据长度}Sqlist;//结构体别名动态定义通过指针分配储存空间。当数据超限,可以通过动态分配内存语句来开辟空间,比较灵活。

2025-01-25 14:45:50 456

原创 【数据结构】线性表

线性表是用于描述元素之间一对一关系的逻辑结构,这里的一对一关系指的是在逻辑上除了第一个元素和最后一个元素之外,一个元素的前面与后面都只有一个元素,就像用线串起来一样,所以叫做线性表。当然实际体现在储存位置上,元素与元素不一定相邻。比如说小明、小明他爸和小明的儿子出去旅游,他们三个不一定住在同一个宾馆里,但是从辈分上来说小明他爸还是他爸,小明儿子还是他儿子,逻辑关系不变。这里给出线性表的严格定义:线性表是具有的n(n>0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。

2025-01-24 12:03:56 157

原创 【数据结构】时间复杂度

在设计算法时,我们通常关注算法的。然而,由于不同计算机的软件和硬件差异,直接通过程序的执行时间来评估算法效率并不可靠。因此,我们通常通过统计算法在求解过程中计算机来算法的运行时间。对于同一个问题,当采用不同算法时,求解过程中语句的执行次数越少,意味着该算法的效率越高。一个语句的是指该语句在算法中被重复执行的次数。事实上,算法中所有语句的频度之和与算法中处于最里层的语句的频度数量级相当。对于下面的代码:该代码的频度和(即所有语句的总执行次数)为n,数量级也为n。该代码的频度和为(n个n的和),数量级也为。

2025-01-24 11:16:18 650

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除