
数据结构
文章平均质量分 85
解析+完整代码
吧啦吧啦嘭
这个作者很懒,什么都没留下…
展开
-
数据结构 完整解析+超全代码 free
完整代码 单链表不带头结点。完整代码 顺序表静态存储。完整代码 顺序表动态存储。按位序插入(不带头结点)完整代码 单链表带头结点。按位序插入(带头结点)树、森林、二叉树的转换。三对角矩阵的压缩存储。由遍历序列构造二叉树。有向无环图描述表达式。完整代码 二叉排序树。完整代码 平衡二叉树。归并、基数、计数排序。原创 2024-12-18 20:24:42 · 834 阅读 · 0 评论 -
【数据结构】各类排序算法 时间复杂度、空间复杂度、稳定性的比较
排序算法大全(快速、堆、归并、插入、折半、希尔、冒泡、计数、基数)各算法比较原创 2024-06-05 13:53:10 · 836 阅读 · 0 评论 -
【数据结构】排序算法大全(快速、堆、归并、插入、折半、希尔、冒泡、计数、基数)各算法比较、解析+完整代码
5.当low==high时完成遍历,将基准元素放入low指针所指的地方,此时基准元素已经排序完成;若左右孩子一样大,优先和左孩子换,建堆时是稳定的,但是在排序时,堆顶和堆底互换,不稳定。对于小根堆,新元素放到表尾(堆底),与父节点对比,若新元素比父节点更加小,则互换。2.随机选取一个元素。2.遍历序列,将比基准元素小的放在基准元素的左边,比基准元素大的放在右边;对于大根堆,新元素放到表尾,与父节点对比,若新元素比父节点更加大,则互换。3.对比i,j所指元素,更小的先加入长序列,并且更小的元素所在指针加一;原创 2024-05-27 09:00:00 · 731 阅读 · 0 评论 -
【数据结构】散列表(拉链法 开发地址法 处理冲突)解析+完整代码
注:删除元素不能简单的将被删元素的空间置为空,否则将截断在它之后的探测路径,可做个已删除的标记,进行逻辑删除。在散列表中插入一个数据元素时,需要根据关键字的值确定其存储地址,若该地址已经存储其他元素,则这种情况为冲突。这种方法得到的散列地址与关键字的每位都有关,因此散列地址分布比较均匀。不同关键字通过散列函数映射到同一个地址,则这两个关键字是在该散列函数下的同义词。2.顺序查找散列表对应的链表,若查找成功,将目标元素从链表里删除。1.根据散列函数算出散列地址,对比关键字是否匹配,匹配则查找成功;原创 2024-05-20 12:57:27 · 1086 阅读 · 0 评论 -
【数据结构】B树和B+树(定义 查找 删除 插入)解析+完整代码
5叉查找树查找方式:顺序查找每个灰框里的元素,找不到则去孩子那里找。如何保证查找效率?若每个结点内关键字太少,导致树变高,要查更多层结点,效率低。解决策略:1.m叉树中,规定除了根节点外,任何结点至少有⌈m2⌉⌈m/2⌉,即至少含有⌈m2⌉−1⌈m/2⌉−1个关键词。2.m叉查找树中,规定对于任何结点,其所有子树的高度都要相同。B树定义B树,又称多路平衡查找树,B树中被允许的孩子个数的最大值称为B树的阶,通常用m表示。原创 2024-05-20 11:50:49 · 1186 阅读 · 0 评论 -
【数据结构】红黑树(定义性质、插入、查找、删除)解析+完整代码
为什么发明红黑树?平衡二叉树和红黑树的时间复杂度相同,但是平衡二叉树的平衡特性容易被破坏,需要频繁调整树的形态。红黑树RBT:插入/删除很多时候不会破坏红黑特性,无需频繁调整树的形态,即需要调整,也可在常数级时间内完成。平衡二叉树:适用于以查为主,少插入删除的场景;红黑树,适用于频繁插入、删除的场景,实用性更强。定义红黑树是二叉排序树 ==》左子树结点原创 2024-05-14 19:23:11 · 928 阅读 · 0 评论 -
【数据结构】平衡二叉树(插入、查找、删除)解析+完整代码
平衡二叉树,简称平衡树(AVL树)树上任一结点的左右子树高度差不超过1。结点的平衡因子=左子树高-右子树高。原创 2024-05-14 14:15:01 · 3070 阅读 · 4 评论 -
【数据结构】二叉排序树(查找+插入+删除+效率分析)完整代码+解析
二叉排序树的定义又称二叉查找树(BST,Binary Search Tree)左子树结点值原创 2024-05-13 11:13:07 · 2998 阅读 · 0 评论 -
【数据结构】折半查找/二分查找 查找判定树+效率分析+完整代码
如果当前low和high之间有偶数个元素,则mid分割后,左半部分比右半部分少一个元素。如果当前low和high之间有奇数个元素,则mid分割后,左右两部分元素个数相等。3.若mid所指元素大,则去前半段查找,即high=mid-1;若mid所指元素小,则去后半段查找,即low=mid+1;2.取中间位置mid=(low+high)/2;1.设置low和high指针,分别在序列首尾;折半查找的判定树中,只有最下面一层是不满的。折半查找的判定树一定是平衡二叉树。折半查找,又称二分查找,仅用于。原创 2024-05-13 09:59:24 · 1469 阅读 · 0 评论 -
【数据结构】图的应用---最小生成树(Prim,Kruskal)、最短路径(BFS,Dijkstra,Floyd)、拓扑排序、关键路径、有向无环图表达式
最小生成树(Prim,Kruskal)、最短路径(BFS,Dijkstra,Floyd)、拓扑排序、关键路径、有向无环图表达式原创 2024-05-12 10:31:38 · 1148 阅读 · 1 评论 -
【数据结构】最小生成树(Prim算法、Kruskal算法)解析+完整代码
设R为G的所有生成树的集合,若T为R中边的权值之和最小的生成树,则T称为G的最小生成树(MST)。每次选则一条权值最小的边,使这条边的两头连通(原本已经连通的不选),直到所有结点都连通。,生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。1.最小生成树可能有多个,但边的权值之和总是唯一且最小的;每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止。数组,找到最小值,将其加入树中,并继续遍历与其相连的边。数组,初始为false,判断结点是否加入树。最低的,且还没加入树的顶点。原创 2024-04-28 22:01:09 · 1124 阅读 · 1 评论 -
【数据结构】图 解析+完整代码(概念、存储、基本操作、遍历)广度优先遍历、深度优先遍历、邻接矩阵、邻接表、十字链表、邻接多重表
图的定义有向图无向图简单图、多重图顶点的度、入度、出度顶点-顶点的关系描述连通图、强连通图子图、生成子图连通分量强连通分量生成树生成森林边的权、带权图特殊形态的图重点小结不带权值的邻接矩阵法求度存储带权图的邻接矩阵法邻接矩阵法的性能分析邻接矩阵的性质定义——顺序+链式存储性能分析注:邻接矩阵表示法是唯一的,但图的邻接表表示法不唯一(∵孩子的链接顺序不唯一)邻接表和邻接矩阵的对比只存储有向图空间复杂度:O(∣V∣+∣E∣)O(|V|+|E|)O(∣V∣+∣E∣)如何找到指定顶点的所有出边?——顺着绿色路线如何原创 2024-04-28 14:40:52 · 1569 阅读 · 0 评论 -
【数据结构】并查集 Find和Union的优化 解析+完整代码
(2)Union(S,Root1,Root2):把集合S中的子集合Root2并入子集合Root1,要求Root1和Root2互不相交,否则不支持合并。(3)Find(S,x):查找集合S中单元素x所在的子集合,并返回该子集合的根节点。(1)Initial(S):将集合S中的每个元素都初始化为只有一个单元素的子集合;压缩路径——Find操作,先找到根结点,再将查找路径上所有结点都挂到根结点下。每次Find操作,先找根,再压缩路径,可使树的高度不超过。∵树越深,越难查找,∴要尽量减小树的深度,原创 2024-04-26 13:58:23 · 1814 阅读 · 2 评论 -
【数据结构】哈夫曼树 哈夫曼编码 解析+完整代码
(2)构造一个新结点,从F中选取两棵根结点权值最小的树作为新结点的左右子树,并且将新结点的权值置为左右子树上根结点的权值之和;1.每个初始结点最终都会成为叶结点,且权值越小的结点到根结点的路径长度越大;(1)将这n个结点分别作为n棵仅含一个结点的二叉树,构成森林F;从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积。(3)从F中删除刚才选出的两棵树,同时将新得到的树加入F中。有某种现实含义的数值(如:表示结点的重要性等)树中所有叶结点的带权路径长度之和。3.哈夫曼树中不存在度为1的结点;原创 2024-04-26 09:59:01 · 1749 阅读 · 0 评论 -
【数据结构】树和森林(树和森林的存储结构、树森林二叉树的转换、树和森林的遍历
基于孩子兄弟表示法:如果当前处理的结点在树中有孩子,就把所有孩子结点“用右指针串成糖葫芦”,并在二叉树中把第一个孩子挂在当前结点的左指针下方。如何恢复一个结点的孩子:在二叉树中,如果当前处理的结点有左孩子,就把左孩子和“一整串右指针糖葫芦”拆下来,按顺序挂在当前结点下方。如何恢复一个结点的孩子:在二叉树中,如果当前处理的孩子有左孩子,就把左孩子和“一整串右指针糖葫芦”拆下来,按顺序挂在当前结点下方。2.从树的根结点开始,按树的层序恢复每个结点的孩子。∴适用于找孩子多,找父亲少的场景,如:服务流程树。原创 2024-04-24 09:49:17 · 1088 阅读 · 0 评论 -
【数据结构】线索二叉树(中序、先序、后序线索二叉树)
∴ 可以利用空指针来存储该结点的前驱后继。因此 二叉树线索化实质是要遍历一次二叉树。目的:为了快速查找结点的前驱和后继。将二叉链表中的空指针改为前后继指针。在结点结构中多加两个int型标志位。而前后继需要遍历二叉树后才能得到。,即空指针数量等于结点总数。指针分别指向左右孩子;指针分别指向前后驱。原创 2024-04-20 16:34:54 · 1179 阅读 · 0 评论 -
【数据结构】二叉树(定义、性质、存储、遍历、构造)解析+完整代码
定义1.每个结点至多有两棵子树;2.左右子树不能颠倒(二叉树是有序树)。特殊二叉树1.满二叉树一棵高度为h,且含有2h−12^h-12h−1个结点的二叉树。特点:(1)只有最后一层有叶子结点;(2)不存在度为1的结点;(3)按层序从1开始编号,结点i的左孩子为2i2i2i,右孩子为2i12i+12i1;结点i的父节点为⌊i2⌋⌊i/2⌋。2.完全二叉树。原创 2024-04-20 13:58:18 · 2896 阅读 · 0 评论 -
【数据结构】串的模式匹配(KMP+朴素模式匹配)
2.对其他的next:在不匹配的位置前,划一条分界线,模式串一步步往后退,直到分界线前能对上,或模式串完全跨过分界线为止。从模式串本身的结构着手,若已匹配相等的前缀序列中有某个后缀正好是模式串的前缀,则可将模式串向后滑动到与这些相等字符对齐的位置。3.若 i 和 j 所指字符不相同,j 回到模式串第一个字符,i 指向下一个子串起始位置; 当模式串中第a个元素匹配失败时,令主串指针i不变,模式串指针j=b。当模式串的第j个字符失配时,从模式串的第next[j]个继续往后匹配。原创 2024-03-15 12:19:28 · 1633 阅读 · 0 评论 -
【数据结构】串 解析+完整代码(求子串、比大小、定位操作)
定义串,即字符串,是由零个或多个字符组成的有限序列。串是一种特殊的线性表,数据元素间呈线性关系。空串:串长度为0时;子串:串中任意个连续的字符组成的子序列;主串:包含子串的串;字符在主串中的位置:字符在串中的符号;子串在主串中的位置:子串的第一个字符在主串中的位置。静态数组实现(定长顺序存储)//用数组存储字符int length;//串的长度}SString;动态数组实现(堆分配存储)用完需要手动freechar*ch;//按串长分配存储区,ch指向串的基地址。原创 2024-03-15 11:22:36 · 1017 阅读 · 0 评论 -
【数据结构】矩阵的压缩存储
是第i行前1~i-1行的所有元素数量;非常量区域和对称矩阵存储方法一毛一样。如何将数组下标k转换为矩阵下标i,j?如何把矩阵下标转化为一维数组下标?元素在第i行的前的元素数量。上三角区域或者下三角区域为一常量。只存储上或下三角区和主对角线。行优先:优先存放一行的数据。列优先:优先存放一列的数据。只要存储值不为0的元素就好。非零元素远少于矩阵元素个数。 会失去随机存储的特性。2.链式存储——十字链表法。若n阶方阵中任意一个元素。在数组最后存储常量的值。原创 2024-03-07 15:05:42 · 1544 阅读 · 0 评论 -
【数据结构】栈和队列的应用——括号匹配 + 表达式求值 + 表达式转换 +栈的递归应用+队列在计算机系统中的应用
括号匹配问题 — 表达式求值 — 表达式转换 — 栈的递归应用 — 队列在计算机系统中的应用 代码+解析原创 2024-03-07 11:50:13 · 1213 阅读 · 0 评论 -
【数据结构】队列 循环队列 双端队列——顺序队列+链式队列完整代码(创建、入队、出队)
顺序队列+链式队列完整代码(创建、入队、出队)——定义只允许在一端进行插入,另一端删除的线性表。特征:先进先出(First In First Out->FIFO)重要术语:队头、队尾、空队列。原创 2024-03-06 14:05:00 · 556 阅读 · 0 评论 -
【数据结构】栈 顺序栈 链栈(共享栈 创建 进栈 出栈 读取)完整代码+解析
定义stack,只允许在一端进行插入和删除的线性表。特点:后进先出卡特兰数当n个不同元素进栈时,出栈元素不同排序的个数为。原创 2024-03-06 08:58:48 · 1300 阅读 · 0 评论 -
【数据结构】顺序表和链表的对比,在各种情况下如何选择
顺序表:修改Length=0,静态分配系统自动回收空间,动态分配需要手动free。表长难估计,经常增、删元素 ——链表。顺序表:需要将元素前移/后移,时间复杂度。,开销主要来自查找目标元素。表长可估计,查询操作多 ——顺序表。如何选择用链表or顺序表?链表:依次free结点。顺序表:容易浪费内存。,开销来自移动元素。原创 2024-03-01 10:10:49 · 987 阅读 · 0 评论 -
【数据结构】双链表解析+完整代码(创建、插入、删除)
定义单链表的缺点:无法逆向操作,插入删除时只能从头开始遍历,很不方便。双链表:每个结点都定义两个指针prior和next,分别指向前驱和后继,可进可退。//前驱指针和后继指针初始化双链表//分配头结点//头结点的前驱指针永远指向NULL//头结点还暂时没有后继判空(带头结点)else。原创 2024-02-29 14:41:00 · 541 阅读 · 0 评论 -
【数据结构】单链表解析+完整代码(插入、删除、尾插法、头插法、按值和按位查找、前插和后插)带头结点和不带两种实现
单链表定义;头插法、尾插法创建单链表;按位插入、后插、前插;按位删除、删除指定结点;按位查找、按值查找;单链表的销毁。附单链表带头结点和不带头结点的两种完整代码。原创 2024-02-29 10:45:59 · 4322 阅读 · 1 评论 -
【数据结构】线性表 顺序表(动态、静态分配,插入删除查找基本操作)解析+完整代码
顺序表定义用顺序存储方式实现线性表的储存。是用一组地址连续的存储单元依次存储线性表中的数据元素。特点:1.表中元素的逻辑顺序与物理顺序相同。2.可以随机存取——知道顺序表起始位置LOC(A)和每个元素所占内存的大小后,可知道任意一个元素的位置。优点1.可随机访问,O(1)时间内找到指定元素;2.存储密度高,每个结点只存储数据元素。缺点1.元素的插入和删除要移动大量数据元素。2.需要连续存储空间,不够灵活。原创 2024-02-26 15:51:07 · 1165 阅读 · 0 评论 -
【数据结构】时间复杂度(加法乘法规则、渐近时间复杂度、循环时间复杂度总结
在实际求解中,只留表达式中最高阶的部分,丢弃其他部分。2.只需挑一个基本操作分析它的执行次数与n的关系即可。最坏时间复杂度、平均时间复杂度、最好时间复杂度。1.顺序执行的代码只会影响常数项,可忽略。3.如果有多层嵌套循环,只需关注。1.找到一个最深层的基本操作;原创 2024-02-25 17:29:38 · 2642 阅读 · 0 评论 -
【数据结构】队列——顺序实现+链式实现(带头结点+不带头结点)入队 出队 初始化 判空 双端队列 完整代码
队列——顺序实现+链式实现(带头结点+不带头结点)入队 出队 初始化 判空 双端队列 完整代码原创 2023-06-30 10:45:25 · 1937 阅读 · 1 评论 -
【数据结构】栈——共享栈、链栈(入栈 出栈 判空 创建 读栈顶元素)完整代码
栈——共享栈、链栈(入栈 出栈 判空 创建 读栈顶元素)完整代码原创 2023-06-29 13:01:24 · 668 阅读 · 0 评论 -
【数据结构】线性表——顺序表 链式表 单链表 双链表 循环链表 静态链表
线性表——顺序表 链式表 单链表 双链表 循环链表 静态链表原创 2023-06-27 21:51:14 · 646 阅读 · 0 评论 -
【数据结构】双链表(定义 创建 插入 删除 销毁 查找)完整代码
双链表(定义 创建 插入 删除 销毁 查找)完整代码原创 2023-06-27 16:48:49 · 182 阅读 · 0 评论 -
【数据结构】单链表 创建 插入 删除 查找 完整代码
单链表 定义 建立 头插法和尾插法 插入 删除 按序号查找 按值查找原创 2023-06-24 15:39:45 · 1090 阅读 · 0 评论 -
【数据结构】DFG——n皇后问题
dg[j + i] 表示 i行j列处,所在的对角线上有没有棋子,udg[n - j + i]表示 i行j列处,所在的反对角线上有没有棋子,col[j]表示第j列上有没有棋子。n− 皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。3.创建3个判断数组:col[],dg[],udg[]分别判断一行中第j个元素在列,对角线,反对角线上是否可行;2.遍历每行,对第i行中的每个元素进行判断(path[i][j]='Q'是否可行);原创 2022-11-12 16:35:13 · 166 阅读 · 0 评论 -
[数据结构]DFS——全排列
图的深度优先搜索算法:先一条路走到黑,走不下去了再返回到上一顶点,直到遍历完所有顶点。//j放在路径第u位上。3.定义函数dfs(int u)表示给第u位赋值,并改变i的状态(赋1)。4.在函数dfs(u)中,完成第u位赋值后,递归给第u+1位赋值。dfs(u + 1);if (u >= n+1)//如果位置已经占满。1.创建path[u]数组储存排列。//存已经确定的数字。void dfs(int u)//u:第u位上。输入一个正整数n,输出1~n的全排列。原创 2022-11-11 21:10:10 · 521 阅读 · 0 评论 -
关键路径 完整代码+解析
关键路径A.相关概念AOE网:边表示活动,顶点表示事件,边上权值表示活动持续时间。AOV网:顶点表示活动,弧表示活动间的优先关系。关键路径用AOE网,顶点表示活动,弧表示活动间的优先关系。入度:到达此顶点的路径条数。出度:从此顶点出去的路径条数。源点:入度为0,路径起始点。汇点:出度为0,路径终止点。拓扑序列:间有一条路径,则这条路径就是拓扑序列。拓扑排序:对有向图构造拓扑序列的过程。对AOV网拓扑排序的思路:1.找到入度为0的顶点输出;2.删去此顶点,及以改顶点为尾的弧;3.重复1,2两步,直到没有入度为原创 2022-06-03 14:56:33 · 1506 阅读 · 2 评论 -
Floyd+Dijkstra最短路径 源码解析
最短路径A.Floyd算法核心思想:建立两个二维数组,D[v][w]=m:顶点v到顶点w的最短路径权值为m。代表顶点到顶点的最短路径权值和的矩阵。P[v][w]=k:顶点v和w之间的中转路径k,即v先到k顶点再到w顶点的路径最短。代表对应顶点的最短路径的前驱矩阵,用来储存路径。D^i[v][w]=min(D^{i-1}[v][w],D^{i-1}[v][k]+D^{i-1}[k][w])if(D^i[v][w]==D^{i-1}[v][w])P[v][w]=w;if(D^i[v][w]=原创 2022-06-03 15:00:04 · 186 阅读 · 0 评论 -
Kruskal最小生成树
Kruskal步骤:1.将图转化为边表。2.按权值排序边表。3.初始化parent[孩子]=父亲。4.依次找边。5.找到最小权值边两顶点的最小孩子。6.比较最小孩子,相等则形成环。7.不相等则把结点存入树中,防止重复访问。#include<stdio.h>#include<stdlib.h>#define MAXEDGE 99#define MAXVEX 999#define INFINITY 65535typedef int VertexType原创 2022-06-02 15:13:39 · 145 阅读 · 0 评论 -
遍历二叉树——前序 中序 后序 层序
遍历二叉树——前序 中序 后序 层序原创 2022-06-01 14:10:45 · 102 阅读 · 0 评论 -
哈夫曼树 构造,编码 完整代码
Haffman Tree构造方法:1.初始化每个叶子结点都是一棵树。2.找最小权值的两棵树。3.合并两树,生成新结点。编码:1.往左为1,右为0.2.不等长编码。#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define MaxN 100 //最大结点个数#define Maxbit 255 //最大编码值#define MaxValue 9999 //最大权原创 2022-04-04 16:31:17 · 2928 阅读 · 2 评论