自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构(7.2_3)——分块查找

分块查找,又称索引顺序查找,算法过程如下:"索引表"中保存每个分块的最大关键字和分块存储区间特点:块内无序,块间有序 查找成功:若索引表中不包含目标关键字,则折半查找索引表最终停在low>high,要在low所指分块中查找 查找失败的例子:

2024-09-11 23:17:48 207

原创 数据结构(7.2_2)——折半查找

折半查找,又称"二分查找",仅适用于有序的顺序表。

2024-09-10 23:17:26 380

原创 数据结构(7.2_1)——顺序查找

顺序查找,又叫"线性查找",通常用于线性表(或者顺序表和链表)。算法思想:从头到尾全部查找出来(或者反过来也OK)查找成功: 查找失败: 查找成功的情况: 查找失败的情况: ”哨兵“方法查找的优点:无需判断是否越界,效率更高默认每个元素的查找概率为1/n 一个成功结点的查找长度=自身所在层数一个失败结点的查找长度=其父节点所在层数默认情况下,各种失败情况或成功情况都等概率发生 将概率大的元素优先放到前面(使用降序排列)

2024-09-10 21:08:36 461

原创 数据结构(7.1)——查找的基本概念

查找——在数据结构集合中寻找满足某种条件的数据元素的过程称为查找查找表(查找结构)——用于查找的数据集合称为查找表,它由同一类型的数据元素(或记录)组成关键字——数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结国应该是唯一的。例1:例2: 静态查找表: 只需进行一个操作,不进行其他操作动态查找表: 进行该操作的时候,会改变其他数据元素查找长度——在查找运算中,需要对比关键字的次数称为查找长度评价查找长度(ASL,Average Search Length) —— 所有查找过程中进行关键

2024-09-09 22:44:09 185

原创 数据结构(6.4_7)——关键路径

在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如完成活动所需的时间),称之为用边表示活动的网络,简称AOE网(Activity On Edge NetWork)在AOE网中,仅有一个入度为0的顶点,称为开始顶点(源点),它表示整个工程的开始;也仅有一个出度为0的顶点,称为结束顶点(汇点),它表示整个工程的结束从源点到汇点的有向路径可能有多条,所有路径中,具有最大路径长度 的路径称为关键路径,而把关键路径上的活动称为关键活动完成整个工程的最短时间就是关键路径的长度,若关键

2024-09-06 22:49:28 400

原创 数据结构(6.4_6)——拓扑排序

AOV网:用顶点表示活动的网。用DAG图(有向无环图)表示一个工程,顶点表示活动,有向边<Vi,Vj>表示活动Vi必须先于vj进行回顾:入度即为以顶点为终点的边的数目代码思路:通过for循环将所有度为0结点的indgree[]下标压入栈中,并初始化print[]数组,使其所有元素为-1,方便记录,再将count指向第一个print数组元素,任何进行while判断,如果栈不为空,则将栈顶元素i弹出栈并进入print数组,count指向下一个数组元素,再通过for循环遍历图中i的所有邻结点,将其度-1,若

2024-09-04 18:39:13 363

原创 数据结构(6.4_5)——有向无环图

有向无环图:若一个有向图中不存在环,则称为有向无环图,简称DAG图(Directed Acyclic Graph)

2024-09-03 19:49:28 241

原创 数据结构(6.4_4)——Floyd算法

第一步:建立两个二维数组,一个用来存放所有顶点,一个用来存放顶点之间的中转点第二步:循环遍历A矩阵,若,则,;否则和保持原值,循环完所有i,j后更新数组并且k+1第三步:重复第二步操作初始:第0轮:第一轮: 第二轮: 总: 代码实现: 时间复杂度和空间复杂度: 1、v0;v1;v2; v3; v4; 循环后无顶点需要更新寻找v0——v4

2024-08-29 22:41:43 438

原创 数据结构(6.4_3)最短路径问题_Dijkstra算法

1、2、3、4、

2024-08-29 02:23:08 319

原创 数据结构(6.4_2)——最短路径问题_BFS算法

改造visit函数后。

2024-08-29 01:46:59 189

原创 数据结构(6.4_1)——最小生成树

连通图的生成树是包含图中全部顶点的一个极小连通子图(边要尽可能的少,但要保持连通)若图中顶点数为n,则它的生成树含有n-1条边。对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。对于一个带权连通无向图G=(V,E),生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。设R为G的所有生成树的集合,若T为R中边的权值之和最小的生成树,则称T为G的最小生成树(Minimum-Spanning-Tree,MST)例:修路问题:普通方案: 从某一个顶点开始构建生成树;每次将代

2024-08-28 02:54:14 312

原创 数据结构(6.3_2)——图的深度优先遍历

树的深度优先遍历分为先根遍历和后根遍历。代码(只能遍历连通图) DFS算法(Final版)代码复杂度分析空间复杂度

2024-08-25 15:41:23 307

原创 数据结构(6_3_1)——图的广度优先遍历

注:以下代码只适合连通图练习:代码: 结论:对于无向图,调用BFS函数的次数=连通分量数

2024-08-23 15:30:20 368

原创 数据结构(6.2_4)——图的基本操作

注:只探讨邻接矩阵和邻接表怎么实现图的基本操作DeleteVertex(G,x):在图G中删除顶点x

2024-08-22 15:35:52 337

原创 数据结构(6_2_3)——十字链表法和多重领接表

橙色入度,绿色出度 代码示例: 十字链表法性能分析 优点:每一条边只对应一个边结点,没有冗余数据,删除结点或者删除边的时候会方便很多 代码示例:总结:

2024-08-20 12:14:20 454

原创 数据结构(6.2_2)——领接表法

代码: 有多少边结点就有多少度有向图的度=入度+出度出度:遍历顶点:对于图中的每个顶点 :a. 遍历边:遍历顶点 的所有出边(即所有形式为 的边,其中 是另一个顶点)。b. 计数:对于每一条出边,将顶点 的出度计数增加1。 入度:遍历边:遍历图中的所有边 :例如寻找入度a的弧,遍历完后找到所有指向0的弧 图的领接表表示方式不唯一图的领接矩阵表示方式唯一

2024-08-18 15:04:28 349

原创 数据结构(6.2_1)——领接矩阵法

邻接矩阵(Adjacency Matrix)是一种使用二维数组来表示图的方法。在这种表示法中,矩阵的行和列都对应图的顶点。 第i个结点的度=第 i 行(或第i列)的非零元素个数时间复杂度=O(n)第i个结点的出度=第 i 行的非零元素个数第i个结点的入度=第 i 列的非零元素个数第i个结点的度=第 i 行、第i列的非零元素个数之和带权图(网)是指图中每条边都有一个与之相关的权重。在邻接矩阵法中,带权图的存储可以通过将邻接矩阵中的元素设置为边的权重来表示。以下是带权图(网)使用邻接矩阵存储的详细说明。若出现

2024-08-17 15:49:37 644

原创 数据结构(6_1_1)——图的基本概念

图G由顶点集V和边集E组成,记为G=(V,E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。若V={v1,v2,.....,vn},则用|V|表示图G中顶点的个数,也称图G的阶,,用|E|表示图G中的边的条数注意:线性表可以是空表,树可以是空树,但图不可以是空,即V一定是非空集 若E是无向边(简称边)的有限集合时,则图G为无向图。边是顶点的无序对,记为(v,w)或(w,v),因为(v,w)=(w,v),其中v,w是顶点。可以说顶点w和顶点v互为邻接点。边(v,w)

2024-08-13 15:39:38 491

原创 数据结构(5.5_3)——并查集的进一步优化

【代码】数据结构(5.5_3)——并查集的进一步优化。

2024-08-10 15:08:52 281

原创 数据结构(5.5_2)——并查集

并查集(Union-Find)是一种树型的数据结构,用于处理一些不交集的合并及查询问题。它支持两种操作:首先将所有根节点数组值设为-1,其他结点数组值对应其父节点的数组下标确定某个元素处于哪个子集,它可以用来确定两个元素是否属于同一个子集。如何“查”到一个元素到底属于哪一个集合?---从指定元素出发,一路向上,找到根结点---如何判断两个元素到底是否属于同一个集合?---分别查到两个元素的根,判断节点是否相同即可---将两个子集合并成一个集合。把两个集合“并“为一个集合---让一棵树成为另一棵树的子树即可-

2024-08-10 01:30:21 404 1

原创 数据结构(5.5_1)——哈夫曼树

在含有n个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称最优二叉树。

2024-08-06 15:24:27 314

原创 数据结构(5.4_2)——树和森林的遍历

若树非空,先访问根结点,再依次对每棵子树进行先根遍历树的先根遍历序列和这棵树相应二叉树的先序序列相同。 伪代码:实例: 我们首先创建了一个树,然后通过 函数将子节点添加到其父节点。 函数按照先根遍历的顺序访问每个节点。最后,我们通过 函数释放了整个树所占用的内存。在主函数 中,我们构建了一个具体的树结构,并执行了先根遍历。若树非空,先依次对每棵子树进行后根遍历,最后再访问根结点树的后根遍历序列和这棵树相应二叉树的中序序列相同。 伪代码:实例:我们首先创建了一个树,然后通过

2024-08-04 02:02:26 1044

原创 数据结构(5.4_1)——树的存储结构

每个结点中保存指向双亲的“指针”新增数据元素无需按逻辑上的次序存储,之家在上一个结点后添加新结点,并记录双亲结点 1、删除结点数据域 2、将尾部数据移动至删除结点位置填充空缺寻找其双亲结点相同的结点顺序存储各个节点,每个结点中保存孩子的链表头指针 树和二叉树的转化:使用孩子兄弟表示法

2024-08-02 12:48:49 350

原创 数据结构(5.3_6)——在线索二叉树中寻找前驱后继

重点:后继=p的右子树中最左下的结点代码: 对中序线索二叉树进行中序遍历(空间复杂度:O(1)):中序线索二叉树找中序前驱重点:前驱=p的左子树中最右下的结点对中序线索二叉树进行逆向中序遍历先序线索二叉树找先序后继若p->ratg==1,则next=p->rchild 若p->rtag==0在先序线索二叉树中找到指定结点*p的先序后继next先序线索二叉树找先序前驱在先序线索二叉树中找到指定结点*p的先序前驱pre用三叉链表来找前驱(有父节点的二叉树)示

2024-07-30 12:38:34 718

原创 数据结构(5.3_5)——二叉树的线索化

第一种寻找中序前驱方法本质上就是一次中序遍历,只不过需要在一边遍历一边处理结点线索化代码: 本质上就是一次先序遍历,只不过需要在一边遍历一边处理结点线索化代码:注意:若在PreThread函数中不添加可能会导致某一结点的pre指针陷入无限循环 本质上就是一次后序遍历,只不过需要在一边遍历一边处理结点线索化代码:

2024-07-29 02:55:47 200

原创 数据结构(5.3_4)——线索二叉树的概念

普通二叉树找某结点前驱和后继的方法n个结点的二叉树,有n+1个空链域!可用来记录前驱,后继的信息

2024-07-26 15:06:09 194 1

原创 数据结构(5.3_3)——由遍历序列构造二叉树

若只给出一棵二叉树的前/中/后/层 序遍历序列中的一种,不能唯一确定一棵二叉树 例:前序遍历序列:DAEFBCHGI 中序遍历序列:DAEFBCHGI

2024-07-25 02:49:15 397

原创 数据结构(5.3_2)——二叉树的层次遍历

注意:存的是指针而不是结点。

2024-07-23 02:15:57 329

原创 数据结构(5.3_1)——二叉树的先中后序遍历

先序遍历——根左右——前缀表达式中序遍历——左根右——中缀表达式后序遍历——左右根——后缀表达式二叉树的遍历(手算) 中序遍历代码后序遍历代码总结:

2024-07-23 02:02:55 427

原创 数据结构(5.2_3)——二叉树的存储结构

1%29%5D1。

2024-07-19 23:42:30 393

原创 数据结构(5.2_2)——二叉树的性质

设非空二叉树中度为0、1和2的结点个数分别为n0、n1和n2,则n0=n2+1(叶子结点比二分支结点多一个)

2024-07-17 18:18:31 420

原创 数据结构(5.2_1)——二叉树的基本定义和术语

二叉树是n(n>=0)个结点的有限集合:特点:每个结点至多只有两颗字数;左子树不能颠倒(二叉树是有序树)满二叉树:一棵高度为h,且含有个结点的二叉树特点: 完全二叉树:当且仅当其每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树特点:二叉排序树 :一棵二叉树或者是空二叉树,或者具有如下性质的二叉树:左子树上所有结点的关键字均小于根结点的关键字:右子树上所有结点的关键字均大于根结点的关键字:左子树和右子树又各是一棵二叉排序树二叉排序树可用于元素的排序、搜索平衡二叉树:树上任一结点的左

2024-07-17 15:42:02 322

原创 数据结构(5.1)——树的性质

1%29%5D。

2024-07-16 11:02:50 260

原创 数据结构(5.0)——树的定义和基本术语

树是n(n>=0)个结点的有限集合,n=0时,称为空树,这是一种特殊情况。在任意一颗非空树中应该满足:有且仅有一个特定的称为根的结点。当n>1时,其余结点可分为m(m>0)个互不相交的有限集合T1、T2、.......,Tm,其中每个集合本身又是一颗树,并且称为根结点的子树 在树形结构中,节点之间的关系可以通过家族关系来类比理解。下面是根据您提供的家族关系术语,对应到树形结构中的节点关系:祖先结点:子孙结点:双亲结点(父结点):孩子结点:兄弟结点:堂兄弟结点:祖先结点:爷爷—>父亲—>你子孙结点: 父亲—>

2024-07-16 10:41:49 342

原创 数据结构(4.5)——next数组的优化

在算出next的解的基础上利用nextVal数组进一步优化算法首先将nextVal[1]无脑等于0;直接从第二个元素开始看,等于,将nextVal数组第next[j]个元素赋值给nextVal[j],如果不相等nextVal[j]的值和next[j]相同。

2024-07-15 12:43:34 340

原创 数据结构(4.4)——求next数组

next[1]都无脑写0next[2]都无脑写1其他next:在不匹配的位置前边,划一条分界线,模式串一步一步往后退,直到分界线之前"能对上",或模式串能完全跨过分界线为止,此时j指向哪儿,next数组值就是多少ababaa的next数组//求next[1]??????->??????/i=1->i=2ababaa-> ababaa //j=0,第一个字符匹配失败,只能匹配下一个子串,++i,++jnext[1]=0;//求next[2]a?????->a??????//i=2。

2024-07-14 09:49:31 398

原创 数据结构(4.3)——KMP算法

KMP算法是一种用于字符串搜索的高效算法,全称为Knuth-Morris-Pratt算法。它通过避免字符串的重复比较,提高搜索效率。KMP算法的核心是“部分匹配”表(也称为“最长公共前后缀”表),这个表用于在搜索过程中确定当发生不匹配时,模式串应该向右滑动多少位。:对于模式串,计算每个位置之前字符串的最长公共前后缀长度。这个表用于在不匹配时决定模式串的滑动距离。:使用Next数组,当模式串与主串在某个位置不匹配时,根据Next数组中的值,将模式串向右滑动相应的位数,而不是重新开始比较。

2024-07-13 12:38:41 801

原创 数据结构(4.2)——朴素模式匹配算法

在主串中找到模式串相同的子串,并返回其所在的位置。子串:主串的一部分,一定存在模式串:不一定能在主串中找到主串长度为n,模式串长度为m朴素模式匹配算法:将主串中所有长度为m的子串(最多对比n-m+1个子串)依次与模式串对比,直到找到一个完全匹配的子串,或所有的子串都不匹配为止 index定位操作就是使用朴素模式匹配算法实现的设主串长度为n,模式串长度为m,则最坏时间复杂度=O(nm)最坏的情况,每个子串都要对比m个字符,共n-m+1个子串,复杂度=O((n-m+1)m)=O(nm) 注:很多时候,n>

2024-07-13 02:49:20 252

原创 数据结构(4.1)——串的存储结构

串(String)的顺序存储是指使用一段连续的存储单元来存储字符串中的字符。计算串的长度动态存储(堆分配存储)注意调用完malloc函数后需要手动用free函数回收内存空间串的链式存储串的链式存储结构是指使用链表来存储字符串中的字符。但这样子的操作会造成内存存储密度过低 所以我们可以优化一下代码,在每个结点多存一些字符 基本操作的实现求子串SubString(&Sub,S,pos,len):求子串。用Sub返回串S的第pos个字符起长度为len的子串

2024-07-13 01:53:33 367

原创 数据结构(4.0)——串的定义和基本操作

串,即字符串(String)是由零个或多个字符组成的有序数列。一般记为S='a1a2....an'(n>=0)其中,S是串名,单引号括起来的字符序列是串的值;ai可以是字母、数字或其他字符;串中字符的个数n称为串的长度。n=0时的串称为空串(用表示)例如:子串:串中任意个连续的字符组成的子序列。例:"IPhone 11"是T的子串主串:包含子串的串。例:T是子串"IPhone 11"的主串字符在主串中的位置:字符在串中的序号。例:"1"在T中的位置是8(第一次出现)

2024-07-12 11:35:43 418

空空如也

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

TA关注的人

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