数据结构考研学习
文章平均质量分 76
使用C/C++ Java Python
练习数据结构考研知识点代码
BaiRong-NUC
醉生梦死谁成器,拓马长枪定乾坤。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
考研/面试 数据结构大题必会代码(理解+记忆,实现使用C++,STL库)
这些算法主要面向数据结构代码填空,算法设计题,复试上机,复试面试其中这些代码是最基础需要掌握的部分。原创 2023-08-03 11:31:11 · 879 阅读 · 0 评论 -
考研数据结构思维导图总结(408,833,834 代码实现C++/C)
学习参考书籍:王道计算机考研数据结构思维导图制作工具:xmind。原创 2023-04-02 17:52:32 · 760 阅读 · 2 评论 -
数据结构-考研难点代码突破(外部排序 - C++实现败者树(三指针树结构实现))
因为我是先看了败者树的思想,然后实现的代码,所以我和网上的主流败者树实现方式不同,我并没有想到使用类似堆的方式,通过数组保存父子节点。我直接将其实现成了树状结构。我这个算法有很多可以优化的地方,但因为考研对这部分代码的要求并不高,所以这里就不改了。// 败者树节点结构,这里使用树状结构实现败者树 struct TreeNode {// 失败节点的归并段在数组的位置 int _win_val = INT_MIN;// 这层节点的胜利者的值 int _win_pos = - 1;原创 2023-03-17 19:41:56 · 1265 阅读 · 0 评论 -
数据结构-考研难点代码突破(查找算法 - 散列表(哈希表)C++实现除留余数法拉链法哈希)
(再哈希法)除了原始的散列函数H(key)之外,多准备几个散列函数,当散列函数冲突时,用下一个散列函数计算一个新地址,直到不冲突为止。最理想情况下,不会发生哈希冲突,此时查找效率为O(1)线性探测法很容易造成关键字、非关键字的“聚集(堆积)”现象,严重影响查找效率。如果不同的关键字通过哈希函数映射到相同的位置,此时这种情况称为哈希冲突。平方探测法:发生冲突时,每次向前/后探测的单元个数按照平方依次递增。线性探测法:发生冲突时,每次往后探测相邻的下一个单元是否为空。时,称为平方探测法,又称二次探测法。原创 2023-03-01 15:51:30 · 1291 阅读 · 0 评论 -
JavaSE_ArrayList模拟实现
Java ArrayList源码学习,模拟实现原创 2022-06-09 11:45:27 · 120 阅读 · 0 评论 -
C_设计优先队列
什么是优先队列:1.优先队列属于队列的一种。2.优先队列比队列多了优先权。3.优先权可以是任何东西.eg:数字大小,年龄高低等等.4.优先队列的思想与队列+选择排序的思想类似。5.每一个数据包括:数据本身+权重eg:入队列顺序为:20 90 10 40 30按照数字从小到大出队列。出队列顺序为10 20 30 40 90假设我们有一个成绩单文件,格式为学号+成绩我们利用选择队列,按学号入队列,按成绩出队列文章目录思路代码实现思路这里采用数组来实现队列结构每一个学生的信息包原创 2021-08-22 17:08:57 · 264 阅读 · 7 评论 -
C语言_链式栈结构+二进制计算器
文章目录1.链式栈结构实现2.利用栈结构的进制计算器1.链式栈结构实现#include<stdio.h>#include<stdlib.h>#include<stdbool.h>typedef int NodeDate;typedef struct Node//链表节点{ NodeDate val; struct Node* next;}Node;//创建节点Node* CreatNode(NodeDate x){ Node* new原创 2021-08-18 17:43:33 · 428 阅读 · 0 评论 -
JavaSE_Queue/Stack模拟实现,C++/Java实现环形队列
Stack底层是一个数组Queue底层是一个链表环形队列环形队列首尾指针移动规则:front=(front+1)%array.length 来达到将数组抽象为环形的方法判断空和满有三种策略注意:方法2,3 获取环形队列尾部的方法时 last指向的是环形队列尾部的下一个位置。所以需要公式 (last+array.length-1)%array.length来计算last指向的上一个节点...原创 2022-06-10 13:03:47 · 189 阅读 · 0 评论 -
数据结构-拓展突破-特殊矩阵(对称矩阵,三角矩阵,三对角矩阵,稀疏矩阵)的压缩存储)
三对角矩阵,又称带状矩阵:当|i-j>1时,有aj= 0 (1原创 2022-10-31 21:32:16 · 6193 阅读 · 0 评论 -
数据结构-考研难点代码突破(C++实现树型查找 - B树插入与遍历,B+树基本概念)
B树,又称多路平衡查找树,B树中所有结点的孩子个数的最大值称为B树的阶,通常用m表示。原创 2023-02-28 19:07:20 · 1745 阅读 · 0 评论 -
数据结构-考研难点代码突破(树型查找 - 红黑树(RBT)插入流程图,删除)
红黑树查找与删除的效率和AVL树相同。但是因为AVL树在插入或删除节点可能破坏AVL树结构,而重新调整树的开销大。所以引出了红黑树。红黑树的插入和删除一般无需调整树的结构,相比于AVL树的调整开销小。所以,在以查为核心的操作下,适合使用AVL树结构;如果要频繁的插入或删除元素,更适合使用红黑树红黑树首先是二叉排序树红黑树的每个节点有两种颜色(红,黑色)树的根节点是黑色的。树的空节点都是黑色的.不存在两个相连的红节点(红节点的父亲与孩子都是黑色的)原创 2023-02-23 14:57:01 · 691 阅读 · 0 评论 -
数据结构-考研难点代码突破(C++实现树型查找 - 平衡二叉树(AVL树)的基本操作(增删))
调整平衡因子a,b平衡因子都变为0,调整a,b节点父指针,调整树的根节点,处理子树的情况,细节和右单旋类似。观察上图,相当于把c节点拆开c做根节点,c的左子树给b右树,c的右子树给a的左树。如果新节点插入的位置在c的右子树上,经过旋转会到a的左子树上,b的平衡因子为-1,a的平衡因子为0(如上图).调整步骤:将a节点连接到b右节点,将原来b右子树连接到a左子树上,这样a,b节点的平衡因子又变回0。如果新节点插入的位置在c的左子树上,经过旋转会到b的右子树上,b的平衡因子为0,a的平衡因子为1.原创 2023-02-21 16:13:22 · 859 阅读 · 0 评论 -
数据结构-考研难点代码突破(C++实现树型查找-二叉搜索树(二叉排序树))
在二叉排序树中删除一个结点时,不能把以该结点为根的子树上的结点都删除,必须先把被删除结点从存储二叉排序树的链表上摘下,将因删除结点而断开的二叉链表重新链接起来,同时确保二叉排序树的性质不会丢失。若二叉排序树的左、右子树的高度之差的绝对值不超过1(这样的二叉排序树称为平衡二叉树)它的平均查找长度为O(logN)但二分查找的判定树唯一,而二叉排序树的查找不唯一,相同的关键字其插入顺序不同可能生成不同的二叉排序树。插入的结点一定是一个新添加的叶结点,且是查找失败时的查找路径上访问的最后一个结点的左孩子或右孩子.原创 2023-02-14 20:25:47 · 861 阅读 · 0 评论 -
数据结构-考研难点代码突破 (图关键路径完全解析(流程+代码) - C++代码)
我们用有向无环网描述某项工程时,数据结构中称这样的网结构为AOE(Activity OnEdge)网,网中的顶点称为“事件”,弧称为“活动”,弧对应的权值代表活动持续的时间。活动的时间余量:活动最迟开始时间-最早开始时间,表示在不增加完成整个工程所需总时间的情况下,活动a可以拖延的时间。,以边上的权值表示完成该活动的开销(如完成活动所需的时间),称之为用边表示活动的网络,简称AOE网。求所有活动的时间余量d(),d(i)=0的活动就是关键活动,由关键活动可得关键路径。原创 2023-01-06 04:29:40 · 1326 阅读 · 0 评论 -
数据结构-考研难点代码突破 (C++实现有向无环图的拓扑排序)
AOV网∶若用DAG 图(有向无环图)表示一个工程,其顶点表示活动,用有向边表示活动 Vi必须先于活动Vj进行的这样一种关系,则将这种有向图称为顶点表示活动的网络,记为 AOV网。在AOV网中,活动Vi是活动Vj的直接前驱,活动Vj是活动Vi的直接后继,这种前驱和后继关系具有传递性,且任何活动V不能以它自己作为自己的前驱或后继。由于输出每个顶点的同时还要删除以它为起点的边,故采用邻接表存储时拓扑排序的时间复杂度为O(V+E),采用邻接矩阵存储时拓扑排序的时间复杂度为 O(V。原创 2023-01-03 17:45:31 · 836 阅读 · 0 评论 -
数据结构-考研难点代码突破(C++实现有向图最短路径算法(Dijkstra,Floyd-Warshall算法)图解操作细节(引自C语言中文网))
在表 1 的基础上,将顶点 1 作为 “中间顶点”,计算从各个顶点出发途径顶点 1 再到达其它顶点的权值,如果比表 1 中记录的权值更小,证明两个顶点之间存在更短的路径,对表 1 进行更新。当图是带权图时,把从一个顶点a到图中其余任意一个顶点x的一条路径(可能不止一条)所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径长度最短的那条路径称为最短路径.初始化默认值(无穷)3-2-1:权值为 1 + 2 = 3,表 1 中 3-1 的权值为 ∞,3 < ∞;原创 2023-01-03 03:25:13 · 2622 阅读 · 1 评论 -
数据结构-考研难点代码突破(C++实现无向图图最小生成树算法(Prim,Kruskal)图解操作细节(引自C语言中文网))
克鲁斯卡尔算法查找最小生成树的方法是:将连通网中所有的边按照权值大小做升序排序,从权值最小的边开始选择,只要此边不和已选择的边一起构成环路,就可以选择它组成最小生成树。B-T 、A-B、S-A 三条边都会和已选 A-C、C-D、B-D、D-T 构成环路,都不能组成最小生成树。从 B-D 边开始挑选,由于尚未选择任何边组成最小生成树,且 B-D 自身不会构成环路,所以 B-D 边可以组成最小生成树。最小生成树的边的权值之和总是唯一的,虽然最小生成树不唯一,但其对应的边的权值之和总是唯一的,而且是最小的。原创 2022-12-28 03:55:27 · 2999 阅读 · 0 评论 -
数据结构-难点代码突破(C++实现图广度优先遍历,深度优先遍历,广度/深度优先遍历生成树和森林,广度优先遍历求单源非带权图两点最短路径)
注意:为了简便起见,这里采用[邻接矩阵](https://blog.youkuaiyun.com/dodamce/article/details/128041066?spm=1001.2014.3001.5501)的方式储存图的边信息@[TOC]图的遍历是指从图中的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。注意到树是一种特殊的图,所以树的遍历实际上也可视为一种特殊的图的遍历。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。 图的遍历比树的遍历原创 2022-12-18 00:54:17 · 2914 阅读 · 0 评论 -
数据结构-难点突破(C++实现图的基本操作(邻接矩阵,邻接表,十字链表法储存,邻接多重表代码))
关于图的数据结构,我曾经自己学过一部分,,但是学习本就是重复的过程,这里打算系统的学习一下图。第一步当然是图的储存和基本操作的实现。要用C++实现图的基本操作。原创 2022-12-02 21:08:49 · 2567 阅读 · 0 评论 -
数据结构-难点突破(C++实现并查集+路径优化,详解哈夫曼编码树)
这样,用到哪个字符时,从哈夫曼树的根结点开始,依次写出经过结点的标记,最终得到的就是该结点的哈夫曼编码。其次,是字符 b 用的多,因此字符 b 编码为 10 ,权值越大,表示此字符在文件中出现的次数越多,那么,为了实现用最少的字符包含最多的内容,就应该给出现次数越多的字符,分配的哈弗曼编码越短。哈夫曼编码就是在哈夫曼树的基础上构建的,这种编码方式最大的优点就是用最少的字符包含最多的信息内容,进而实现信息的压缩存储。从树的根到任意结点的路径长度(经过的边数)与该结点上权值的乘积,称为该结点的带权路径长度。原创 2022-11-23 16:56:01 · 1199 阅读 · 0 评论 -
数据结构-难点突破(C++实现树的双亲表示法,孩子表示法,孩子兄弟表示法(树转化为二叉树))
其存储过程是:从树的根节点开始,使用顺序表依次存储树中各个节点。需要注意,与双亲表示法不同的是,孩子表示法会给各个节点配备一个链表,用于存储各节点的孩子节点位于顺序表中的位置。通过孩子兄弟表示法,任意一棵普通树都可以相应转化为一棵二叉树,它们是一一对应的。具体实现方案是:从树的根节点开始,依次存储各个结点的孩子结点和兄弟结点。孩子表示法存储普通树采用的是 “顺序表+链表” 的组合结构。如果节点没有孩子节点(叶子节点),则该节点的链表为空链表。所谓孩子兄弟表示法,指的是用将整棵树用二叉链表存储起来.原创 2022-11-22 20:58:04 · 4090 阅读 · 0 评论 -
数据结构-难点突破(线索化二叉树与遍历 C++中序线索化二叉树,前序线索二叉树,后序线索二叉树)
原来的二叉链表的节点中包含了两个指针域(左右指针)、一个数据域,很难确定节点的两个指针域保存的是子树还是线索了。那么为了解决这样的问题,我们需要在结构定义的基础上加入两个标志位( ltag、rtag )分别用来表示当前指针的指向的含义。那么根据遍历来进行线索化的方式也就有四种方式:先序线索化、中序线索化、后序线索化、层序线索化,其实严格意义上来说,除了遍历的顺序不同,其他的没什么太大的区别。对于线索化来将也是一样的。唯一不同的是:在进行遍历线索二叉树时,后序遍历需要记录父节点,这里采用参考博客的思路。原创 2022-11-09 16:30:21 · 1590 阅读 · 1 评论 -
数据结构-难点突破(C++/Java详解实现串匹配算法KMP,next数组求法,KMP算法优化nextval数组)
保存字串某个位置匹配失败后回退的位置。next数组的下标就是匹配失败的字符在字串的位置,对应下标的值就是j需要回退的位置。原创 2022-11-03 20:59:54 · 860 阅读 · 0 评论 -
数据结构 - 拓展突破(C++实现中缀表达式转前缀表达式,中缀表达式转后缀表达式,前缀表达式求值,中缀表达式求值)
从右至左扫描表达式,从右边第一个字符开始判断如果当前字符(或字符串)为数字或变量,则直接压入数字栈内;如果是运算符,则弹出两个数字运算;如此反复,直到读完整个表达式;输出前缀表达式为: * ,+,a,b,+,c,d。从右至左扫描中缀表达式,从右边第一个字符开始判断。输入中缀表达式:(a+b) * (c+d)整体思路正好于后缀相反。初始化一个运算符栈st。原创 2022-11-01 16:41:50 · 3035 阅读 · 0 评论 -
数据结构(C++)- 模拟实现跳表SkipList(Redis内部数据结构),跳表与哈希表,红黑树对比
这里不在要求严格的格式匹配,在插入节点时候随机出一个层数,这样每次插入和删除都不需要考虑其他节点的层数,方便处理。这样所有的新增指针又会组成一个新的链表,但包含的节点的个数只有原来的一半,遍历链表的速度也会提高一半。节点层数大于等于3的概率为p ^ 2,而节点层数恰好等于3的概率为p ^ 2×(1-p)。节点层数大于等于4的概率为p ^ 3,而节点层数恰好等于4的概率为p^3×(1-p)。节点层数大于等于2的概率为p,而节点层数恰好等于2的概率为p(1-p)。节点层数恰好等于1的概率为1-p。原创 2022-08-22 22:43:22 · 1482 阅读 · 0 评论 -
数据结构(C++)[B树(B-树)插入与中序遍历,效率分析]、B+树、B*树、B树系列应用
所以,分裂后原节点,兄弟节点,新节点各个都有2/3的数据,B*树分配新结点的概率比B+树要低,且新节点与原来节点的数据均分,空间使用率更高。eg:三阶B树插入关键字(53, 139, 75, 49, 145, 36, 50, 47, 101)B+树是B树的变形,是在B树的基础上优化的多路平衡搜索树,B+树的规则与B树基本类似。B*树是B+树的变形,在B+树的非根和非叶子节点再增加指向兄弟节点的指针。B树的结构中,树中的节点保存的是数据在磁盘中的位置。B树采用的是优化AVL树的方式提高效率。...原创 2022-08-17 18:37:12 · 1275 阅读 · 1 评论 -
JavaSE_Java实现开散列哈希桶,测试重载hashCode方法
C++哈希函数_哈希表_哈希冲突_负载因子_仿函数_针对字符串的模板特化特化_闭散列(线性探测)哈希表_开散列哈希桶的模拟实现(Key_Value模型数组具体思路看上面的链接,这里直接给出Java代码原创 2022-06-28 22:00:02 · 216 阅读 · 0 评论 -
数据结构-考研难点代码突破(C/C++/Java排序算法,性能及其稳定性分析(内部排序))
插入排序交换排序选择排序归并排序(二路)计数排序插入排序基本思想:每次将一个待排序的记录按照其关键字大小插入前面已经拍好序的子序列中,直到全部元素插入完成直接插入排序:稳定性:元素比较是从后向前进行比较,因为arr[endpos] > next时endpos才会发生移动,所以相同值的相对位置不会发生改变,是稳定排序。折半插入排序与直接插入类似,只是在每次从有序的子序列找next应该插入的位置时采用折半查找法。(因为吧next前子序列之前就是有序的)折半插入排序:稳定性:元素比较是从后向前进行比较,因为折原创 2022-06-13 14:20:45 · 701 阅读 · 3 评论 -
JavaSE_大堆模拟实现,TopK问题
2.TopK问题求前K个最小的元素,需要建立大小为K的大堆。求前K个最大的元素,需要建立大小为K的小堆。这里以求前K个最小的元素为例原创 2022-06-11 20:31:32 · 135 阅读 · 0 评论 -
JavaSE_Java/C++模拟实现二叉树、C++/Java四种二叉树遍历题型(递归、非递归、Morris)遍历
Java构造二叉树的方式采用传递数组的形式。利用2*根节点下标+1=左子节点下标,2 *根节点下标+2=右子节点下标的方式构建2.C++模拟实现二叉树(层序构建二叉树)C++创建二叉树时采用层序遍历的方法。使用队列辅助创建,同样需要传入数组.这里在构造函数中抛出异常可能会导致内存泄漏。本应该用智能指针的,搞了半天没搞出来。此外:这里添加了一个父亲节点和标记位来辅助删除多创建的节点。其他的逻辑和上面的Java版本类似,不在赘述Java:C++:2)非递归版本Java:C++:3)Morr原创 2022-06-11 11:10:17 · 306 阅读 · 0 评论 -
C++_STL_map(map.insert返回值,三种统计次数,按照key值排序,按照value值排序(vector/multimap/multiset/优先级队列))
文章目录1.利用map是搜索二叉树特性统计次数2.STL_map.insert()返回值利用map.insert()的返回值来统计次数3.利用[]运算符重载统计次数map中[]运算符重载4.map按照value排序方法一:创建map迭代器数组,调用sort自定义排序规则排序(不稳定)方法二:利用multimap/multiset来改变排序的key(稳定)控制multimap和multiset的键值排序方式(仿函数)方法三:利用优先级队列保存map迭代器指针来对map的value排序(堆排序不稳定)1.利用原创 2021-10-31 19:48:35 · 1738 阅读 · 5 评论 -
C++ 并查集(定义、路径压缩、应用(剑指 Offer II 116. 省份数量、LeetCode等式方程的可满足性)、模拟实现)
文章目录1.并查集的定义2.并查集的应用3.C++模拟实现并查集数据结构C++代码如下间并查集练习LeetCode等式方程的可满足性1.并查集的定义并查集是一个多棵树的集合(森林)。并查集由多个集合构成,每一个集合就是一颗树。并:合并多个集合。查:判断两个值是否再一个集合中。每棵树存在数组中,使用双亲表示法。数组每个元素的父节点。如果没有父节点数组保存-1。根节点位置的数组值就算这颗树节点的个数。eg:2.并查集的应用剑指 Offer II 116. 省份数量返回省份数量本质是返回并查原创 2022-04-24 18:00:56 · 659 阅读 · 0 评论 -
数据结构-考研时间复杂度的计算,408时间复杂度真题2011-2022分析
文章目录1.时间复杂度大O的渐进法表示最好、平均和最坏情况具体函数分析2.空间复杂度1.时间复杂度时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法所花费的时间与其中语句的执行次数成正比例。所以算法中的基本操作的执行次数,为算法的时间复杂度。大O用来表示程序执行次数的大O的渐进法表示1、用常数1取代运行时间中的所有加法常数。2、在修改后的运行次数函数中,只保留最高阶项。3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大原创 2021-03-30 14:20:59 · 11513 阅读 · 10 评论 -
单链表判断是否带环,寻找环起始点(图文解析)
文章目录1.判断单链表是否带环为什么快指针走2步,慢指针走1步一定可以相遇如果快指针每次不是走两个节点,是否还会相遇2.找入环点1.判断单链表是否带环给定一个单链表,如果带环返回true,不带环返回false.这里设了两个指针,快指针一次走两个节点,慢指针一次走一个节点。那么如果两个指针在环里相遇,表明单链表带环,如果fast->next==/NULL表明不带环,fast==NULL表明空链表也返回false.接口代码如下://struct ListNode //{ // int原创 2021-04-13 17:36:57 · 1872 阅读 · 3 评论 -
C++二叉搜索树(插入_删除(替换法)_查找_遍历_二叉搜索树检查)_二叉链递归与三叉链非递归
文章目录1.二叉链形式递归2.三叉链形式+动态插入动态删除过程_非递归运行结果二叉搜索树删除节点思路1.二叉链形式递归#pragma once#include<iostream>using namespace std;template<class Key,class Value>struct BSTreeNode{ BSTreeNode<Key,Value>* _left; BSTreeNode<Key,Value>* _right;原创 2021-11-28 16:27:59 · 556 阅读 · 0 评论 -
C++哈希函数_哈希表_哈希冲突_负载因子_仿函数_针对字符串的模板特化特化_闭散列(线性探测)哈希表_开散列哈希桶的模拟实现(Key_Value模型数组)
文章目录1.哈希中的基本概念哈希函数常见的哈希函数与缺陷哈希表2.哈希冲突哈希冲突的解决方法(闭散列与开散列)闭散列(开放地址法)负载因子C++实现除留余数法闭散列线性探测哈希表(Key_Value模型)开散列(哈希桶/拉链法)C++实现除留余数法开散列哈希桶(Key_Value模型)3.代码位置1.哈希中的基本概念哈希函数之前的二叉搜索树与红黑树以及顺序结构他们的关键字和它的储存位置没有对应关系,所以在查找一个元素时要经过多次的关键字比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(l原创 2021-12-25 12:46:39 · 1609 阅读 · 6 评论
分享