![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 58
LiterMa
这个作者很懒,什么都没留下…
展开
-
外部排序优化
目录败者树一、定义:二、败者树在多路平衡归并中的应用小结:置换-选择排序小结:最佳归并树一、计算磁盘读写次数二、以R1--R5为叶结点构造2路归并的最佳归并树(参考哈夫曼树的构造)三、多路归并的情况四、如果减少一个归并段要补充几个虚段?小结:下一篇:败者树为了优化多路平衡归并带来的负面效果用败者树选出最小的元素一、定义:如上图,天津饭是冠军,但是天津饭退赛(被选为最小的)派大星代替参赛,此时不用重新比一遍,原创 2021-07-21 01:05:28 · 381 阅读 · 1 评论 -
排序之外部排序
目录一、外存于内存间的数据交换外部排序思想:二、操作步骤优化点:归并趟数1、多路归并2、减少r小结:下一篇:一、外存于内存间的数据交换读入修改写回外部排序思想:二、操作步骤1、使每个磁盘中的块内都有序先读入两块数据进内存使用内部排序排好序后(指的是这里进入6内存的6个数全部有序,称为一个归并段)通过输出缓冲区写回磁盘依次往后进行此操作,使得全部局部有序...原创 2021-07-20 23:25:21 · 240 阅读 · 0 评论 -
排序之基数排序
目录思想:案例:效率分析:应用:小结:下一篇:思想:例如最高3位数的排序,则百位影响最大,个位影响最小案例:第一趟分配第一趟收集第二趟分配(按十位)第二趟收集第三趟分配(按百位)第三趟收集总览:效率分析:从该图可看出,收集一个Qi的队列只需要O(1)的时间,则一趟是O(r)稳定性:稳定应用:适用场景:小..原创 2021-07-20 23:21:17 · 100 阅读 · 0 评论 -
排序之归并排序
目录归并思想:二路归并过程整体代码效率分析小结:下一篇:归并思想:2路归并4路归并m路归并二路归并过程核心操作整体代码效率分析空间复杂度来源于辅助数组O(n) (递归带来的log2n省去)小结:...原创 2021-07-20 23:19:27 · 111 阅读 · 0 评论 -
排序之堆排序
目录一、堆的定义二、建立大根堆(小根堆会得到递减序列)三、进行排序代码实现:小结:四、堆中插入新元素五、堆中删除元素小结:下一篇:一、堆的定义理解为完全二叉树二、建立大根堆(小根堆会得到递减序列)非终端结点编号为n/2向下取整代码:三、进行排序87与堆底元素互换后,发现该堆不是个大根堆,要将该堆调整,将09下沉调整后第一趟处理完成依次处理完堆中所有元素最后结果:...原创 2021-07-20 23:17:50 · 174 阅读 · 0 评论 -
简单选择排序
目录思想:代码实现:性能分析:小结:下一篇:思想:代码实现:性能分析:小结:原创 2021-07-20 23:15:50 · 77 阅读 · 0 评论 -
排序之快速排序
目录算法思想:过程:效率分析小结:下一篇:算法思想:过程:low元素开始所指的元素作为基准元素,且此时基准元素的位置表示为空low的左边要都小于基准元素,high右边大于基准元素从high开始向左移动,若high所指小于基准元素,则把该元素移动到low指针所指的空位置,并开始移动low元素如果low所指小于基准元素,high大于基准元素则不需要移动,直接low++,high++如果low元素所指大于基准元素则与high所指的空元素交换...原创 2021-07-20 23:14:34 · 121 阅读 · 0 评论 -
排序之冒泡排序
目录定义:代码实现:性能分析:小结:下一篇:定义:不断比较相邻两个元素的大小,来使得前面的元素小于后面的元素相同的元素不交换保证稳定性代码实现:性能分析:稳定性:稳定适用于链表小结:...原创 2021-07-20 23:12:42 · 102 阅读 · 0 评论 -
排序之希尔排序
目录一、定义代码实现下一篇:一、定义完成后第二趟完成后第三趟(d=1了就是对整个表进行直接插入排序)考试中:代码实现空间复杂度为O(1)稳定性小结:...原创 2021-07-20 23:10:20 · 90 阅读 · 0 评论 -
排序之插入排序
目录算法思想:代码:分析效率:小结:下一篇:算法思想:代码:带哨兵的写法分析效率:空间复杂度O(1)时间复杂度:最好情况最坏情况平均情况优化(折半查找确定位置,减少了比较次数)为了保证稳定性代码:整体时间复杂度任然是O(n^2)对链表的插入排序实现略,由于链表的特性移动元素的次数比顺序表少很多,但是仍是O(n^2)小结:...原创 2021-07-20 23:09:01 · 96 阅读 · 0 评论 -
排序的定义
目录一、定义二、评价指标三、排序的分类小结:下一篇:一、定义二、评价指标1、空间复杂度2、时间复杂度3、稳定性稳定好还是不稳定好得看实际需求三、排序的分类小结:...原创 2021-07-20 23:07:23 · 182 阅读 · 0 评论 -
散列表(Hash Table)
目录一、定义二、处理冲突的方法1、拉链法(java中的HashSet等)装填因子三、设计散列函数1、除留余数法2、直接定址法3、数字分析法4、平方取中法5、开放定址法(1)线性探测法(2)解决聚集问题:平方探测法(3)伪随机序列法(4)再散列法(使用多个散列函数)小结:下一篇:一、定义示例:当取余进行到1时,1已经存了一个元素了当不同的关键字通过散列函数映射到同一个值,则他们为“同义词”,确定的位置已经存放了其他元素..原创 2021-07-18 16:43:04 · 122 阅读 · 1 评论 -
查找之B+树
目录一、定义二、B与B+对比下一篇:一、定义B+树示例思想很想分块查找符合以下条件:其中记录代表的是该结点对应存储的各种数据记录如学生信息(所以叶结点包含所有的关键字,也是n个关键字对应n个分支),除了叶子结点,其他结点都是起到一个索引作用为什么当根结点不是叶子时必须有两颗子树查找成功的例子:查找失败的例子无论查找成功或失败,最终一定要走到最下面一层结点二、B与B+对比B+树在磁盘读取以及索引上...原创 2021-07-17 00:30:21 · 206 阅读 · 0 评论 -
查找之B树
一、将二叉查找树拓展为m叉//5叉排序树的结点定义struct Node{ElemType key[4];//最多4个关键字 struct Node *child[5];//最多5个汉字int num;//结点中有几个关键字 }; 每个分叉就是一个查找范围紫色为失败结点查找一个元素查找失败的例子:如何保证查找效率1、若每个结点关键字太少,导致树变高,要查找更多层结点,效率变低注:是向上取整例如5叉就除了根结...原创 2021-07-16 23:37:45 · 293 阅读 · 1 评论 -
查找之分块查找
目录分块查找思想:分析二分查找在查找索引时的过程查找效率分析:小结:思考:下一篇:分块查找思想:low和high是区间范围,maxValue是区间最大值每次查找先查找索引表,找到索引表中区间最大值第一次大于该key的区间(可顺序、可折半),再在该区间中通过顺序查找找到key分析二分查找在查找索引时的过程情况一:查找目标是某个区间最大值,正常二分查找即可情况二:查找目标不是区间最大值那么最后一定会有mid=low=high如果:...原创 2021-07-15 00:48:56 · 264 阅读 · 1 评论 -
查找之折半查找
目录代码:效率分析:构造查找判定树小结:思考:下一篇又叫二分查找,仅适用于有序顺序表(链表不行)low在表头,high在表尾,mid=(low+high)/2或者low+(high-low)/2代码://二分查找//SSTable是有序表,key是关键字可以是任意类型 int Binary_Search(SSTable L,int key){int low=0,high=L.TableLen-1,mid;while(low<=high...原创 2021-07-15 00:02:12 · 1199 阅读 · 1 评论 -
查找之顺序查找
目录思想:代码:查找效率分析:优化:小结:下一篇:思想:从头到尾依次查找通常用于线性表(同样能用在链表)代码://顺序查找typedef struct {//查找表结构 int *elem;//动态数组基址 int TableLen;//表长度 }SSTable;//省略线性表创建添加删除等操作实现 //顺序查找int Search_Seq(SSTable ST,int key){int i;//注意:表长度从1开始,...原创 2021-07-14 22:57:21 · 213 阅读 · 1 评论 -
查找基本基本概念
目录基本概念常见操作查找算法评价指标小结:下一篇:基本概念常见操作若只进行1则为静态查找表若还要进行2则为动态查找表查找算法评价指标小结:...原创 2021-07-14 22:10:02 · 71 阅读 · 0 评论 -
图的关键路径
目录一、AOE网定义二、性质三、计算与分析四、求关键路径步骤下一篇:一、AOE网定义二、性质AOE网仅有一个入度为0的顶点(开始顶点(源点))表示工程的开始仅有一个出度为0的顶点(结束顶点(汇点)),表示工程的结束从源点到汇点可走的路径有很多条,具有最大路径长度的路径为关键路径,上面的活动为关键活动,该路径的长度为项目完成的最短时间,若这几个活动不能按时完成,则工程完成时间就会延长三、计算与分析1、事件vk的最早发生时间ve(k...原创 2021-07-13 21:30:47 · 286 阅读 · 0 评论 -
有向无环图DAG
目录一、描述表达式二、拓扑排序三、逆拓扑排序小结:下一篇:定义:若一个有向图不存在环,则称为有向无环图(Directed Acyclic Graph)一、描述表达式对于这个表达式使用二叉树表示显然红色和绿色部分冗余了我们可以将这两个冗余部分合并,以减少存储空间就形成了一个DAG图其中还有可以合并的部分全部合并后在考研题目中这种题目很容易漏掉某个可合并项比较好的方法:练习:第一步...原创 2021-07-13 21:23:07 · 611 阅读 · 2 评论 -
最短路径算法
目录一、BFS求无权图的单源点最短路径二、迪杰斯特拉,带权图的最短路径三、弗洛伊德(Floyd)算法小结:下一篇:单源最短路径和每对顶点间的最短路径一、BFS求无权图的单源点最短路径原理:从源点开始BFS遍历,按BFS的规则,将每个被遍历到的顶点(且没被访问过)的距离设为上一个顶点的距离值+1代码(伪)://求u到其他顶点的最短路径,G为无权图 void BFS_MIN_Distance(Graph G,int u){//数组d代表从u到i...原创 2021-07-11 00:08:33 · 624 阅读 · 1 评论 -
最小生成树
目录一、最小生成树定义:二、普里姆算法(Prim)三、Kruskal算法(克鲁斯卡尔)小结:下一篇:问题:一、最小生成树定义:对于一个带权连通无向图G=(V,E),生成树不同,每棵树的权(树中所有边上的权值和)也不同,设R为G的所有生成树的集合,若T为R中权值和最小的生成树,则T称为G的最小生成树(Minimum-Spanning-Tree,MST)注:1、最小生成树可能有多个,但边的权值之和总是唯一且最小的2、最小生成树的边数=定点数-1,砍掉一条则不...原创 2021-07-10 19:49:49 · 19449 阅读 · 0 评论 -
图的基本操作与遍历
目录一、操作概览:二、操作详解三、广度优先算法(1)和树的广度优先遍历是很相似的(2)要点:(3)代码(4)非连通图处理(5)效率分析:(6)广度优先生成树(7)广度优先生成森林小结:四、图的深度优先遍历(1)代码:(2)对非连通图的处理(3)空间复杂度(4)深度优先生成树和森林(5)图的遍历与图的连通性小结:下一篇:一、操作概览:这里只探讨邻接矩阵与邻接表怎么实现这些操作二、操作详解1、判断图是否有边<..原创 2021-07-03 22:02:10 · 372 阅读 · 0 评论 -
图的存储十字链表和邻接多重表
目录一、十字链表存储二、邻接多重表存储无向图小结:下一篇:一、十字链表存储注:A->B ,其中B是弧头,A是弧尾例子:即:顶点结点中绿色色块代表由某条弧指向另一个顶点橙色色块代表被某个顶点指向弧结点中下面的色块,绿色代表都是同一个弧尾也即是同一个顶点指向其他顶点,橙色部分代表都指向同一个顶点重点还是看弧结点中上面的色块很明显的表示了由哪个顶点指向哪个顶点,找某个顶点的出度就是从绿色色块出发,入度就是从橙色色块出发只能存储有向图...原创 2021-06-29 19:39:02 · 119 阅读 · 1 评论 -
图的存储邻接表
目录一、原理以及实现二、空间复杂度:三、入度出度小结:下一篇:一、原理以及实现由于邻接矩阵O(n^2)的空间复杂度不适合存储稀疏图邻接表采用顺序+链式存储结构体代码//边的结构typedef struct ArcNode{int adjvex;//指向哪一个结点struct ArcNode *next;//下一条弧的指针 //可以带上权值信息 }ArcNode;//邻接表结点结构 typedef struct VNode{in...原创 2021-06-29 18:30:34 · 105 阅读 · 0 评论 -
图的存储邻接矩阵
目录一、邻接矩阵二、邻接矩阵的性质小结:下一篇一、邻接矩阵注意:(A行,B列)表示有从到到B的邻接边如图:对于无向图,矩阵中的每一个1代表两个顶点邻接(存在一条边)0代表不邻接,一条边代表两个1(因为无向)对于有向图,与无向图不同,一个弧代只表一个1结构://邻接矩阵存储图//顶点最大数 #define MaxVertexNum 100typedef struct {char Vex[MaxVertexNum];//顶点表i...原创 2021-06-28 19:39:16 · 390 阅读 · 1 评论 -
图的基本概念
目录一、图的定义二、图结构的应用三、无向图有向图四、简单图和多重图五、顶点的特点六、子图(图的局部)七、连通分量八、生成树九、边的权、带权图/网小结:下一篇:一、图的定义图G由顶点集V和边集E组成,记为G=(V,E)V(G)表示G中图中顶点的有限非空及,E(G)表示图G的顶点之间的关系(边)集。若V={v1,v2,v3,…,vn},则|V|表示G中顶点的个数,也称G的阶E={ (u,v) | u∈V,v∈V },用|E|表示G中边的...原创 2021-06-26 21:57:50 · 149 阅读 · 1 评论 -
哈夫曼树与编码
目录一、带权路径长度二、哈夫曼树的定义三、哈夫曼树的构造算法特点四、哈夫曼树应用:哈夫曼编码小结:下一篇:一、带权路径长度1、结点的权:实现某种含义的数值2、结点的带权路径长度:从树的根到该结点的路径长度与该结点上权值的乘积例如:3、树的带权路径长度:树中所有叶结点的带权路径长度之和二、哈夫曼树的定义在含有n个带权叶结点的二叉树中,其中带权路径WPL最小的二叉树为哈夫曼树,也称最优二叉树。三、哈夫曼树的构造...原创 2021-06-25 12:17:58 · 151 阅读 · 1 评论 -
平衡二叉树
目录定义:四种情况(1)LL平衡旋转(右单旋转)(2)RR平衡旋转(3)LR旋转:(4)RL旋转查找效率分析小结定义:平衡二叉树(Balanced Binary Tree),简AVL树,树上任一结点的左子树和右子树的高度之差不超过1平衡因子=左子树高-右子树高,所以平衡二叉树的平衡因子只可能是-1、0或1,只要平衡因子的绝对值大于1就不是平衡二叉树在二叉排序树中插入新结点后,如何保持平衡?调整最小不平衡子树:从插入结点往回找到第一个...原创 2021-06-23 14:37:11 · 433 阅读 · 0 评论 -
二叉排序树
目录一、定义二、查找三、插入四、二叉排序树的删除小结:下一篇:一、定义二叉排序树或二叉查找树(BST,Binary Search Tree)性质:左子树上所有的结点的关键字均小于根结点的关键字右子树上所有的结点的关键字均大于根结点的关键字左子树和右子树又各是一棵二叉排序树由于这些特性通过中序遍历可以得到一个递增的有序序列可以很方便的实现有序组织、搜索二、查找代码实现BSTNode *BST_Search(BSTree T,in...原创 2021-06-23 10:17:52 · 243 阅读 · 0 评论 -
树和森林的遍历
目录一、树的先根遍历二、树的后根遍历(深度优先遍历)三、树的层次遍历(广度优先遍历)四、森林的遍历1、先序遍历森林2、中序遍历(这么叫是因为对标二叉树的中序遍历)五、小结:下一篇:一、树的先根遍历若树非空,先访问根结点,再依次对每棵子树进行先根遍历伪代码描述void PreOrder(TreeNode *R){if(R!=NULL){visit(R);while(R还有下一个子树T)PreOrder(T);}}其实与这棵...原创 2021-04-21 21:51:51 · 251 阅读 · 0 评论 -
树的顺序存储结构
目录一、双亲表示法(顺序存储)二、孩子表示法(顺序+链式存储)三、孩子兄弟表示法(链式存储)四、二叉树转换为树五、森林和二叉树的转换六、小结下一篇:一、双亲表示法(顺序存储)实现:#define MAX_TREE_SIZE 100//数的最大结点 typedef struct{int data;//数据域 int parent;//双亲域(双亲数组下标) }PTNode;typedef struct{//树的类型 PTNo...原创 2021-04-21 21:17:29 · 3176 阅读 · 0 评论 -
线索二叉树
目录一、引出代码实现:二、中序线索二叉树二叉树线索化小结:三、代码实现二叉树线索化中序线索化:先序线索二叉树后序略:(几乎同中序一样)小结:四、在线索二叉树中找前驱、后继找后继代码:找前驱代码:先序线索二叉树找后继:找前驱:后序线索二叉树找后序前驱找后继小结:下一篇:一、引出如何在普通二叉树中找到一个中序遍历中任意结点的前驱?例如:中序遍历:DGBEAFC要找F的前驱A要怎么做?一种办法...原创 2021-04-20 22:31:11 · 382 阅读 · 0 评论 -
由遍历序列构造二叉树
目录一、探讨:二、前序+中序示例:三、后续+中序例子:四、层序+中序五、探讨:前序、后序、层序序列的两两是否可以确定唯一一棵二叉树小结:下一篇:一、探讨:给定一个二叉树,该二叉树的前、中、后、层序遍历肯定是唯一的,但是给定一个前、中、后、层序遍历并不能确定唯一的二叉树也就是:若只给出一棵二叉树的前、中、后、层序遍历中的一种不能确定一棵二叉树只有给出其中两种才能确定一棵二叉树(且一定要有中序)二、前序+中序示例:...原创 2021-04-12 17:33:56 · 443 阅读 · 0 评论 -
二叉树的层序遍历
目录示例:算法思路:层序遍历下一篇:示例:算法思路:1、初始化一个辅助队列2、根结点入队3、若队列非空,则队头结点出队,访问该节点,并将其左孩子、右孩子插入队尾(如果有的话)4、重复3直至队列为空层序遍历 void LevelOrder(BiTree T){std:: queue<BiTree> Q;//使用STL中的Queue BiTree p;//用队列保存结点的指针比保存结点本身需要的空间会少很多 //入队Q...原创 2021-04-12 16:33:30 · 101 阅读 · 2 评论 -
二叉树的先中后序遍历
目录二叉树的递归特性练习1:最稳妥的方法:分支结点逐层展开法(过程)先序遍历:中序遍历:后序遍历:练习2:拟递归路过法求递归序列模遍历的代码实现:先序遍历中序遍历后序遍历//求树的深度小结:下一篇:二叉树的递归特性1、要么是个空二叉树2、要么就是由“根结点+左子树+右子树”组成的二叉树先序遍历:根左右(NLR)中序遍历:左根右(LNR)后序遍历:左右根(LRN)示例:先序遍历:ABDEC...原创 2021-04-12 15:45:27 · 295 阅读 · 0 评论 -
二叉树的存储结构
目录一、示例树(完全二叉树):存储结构1、结构定义:2、基本操作:二、非完全二叉树示例树若这么存储最坏情况:结论:二叉树的顺序存储及结构,只适合存储完全二叉树链式存储下一篇:一、示例树(完全二叉树):存储结构1、结构定义://顺序存储#define MaxSize 100struct TreeNode{int value;//结点中的数据元素 bool isEmpty;//结点是否为空 };//定义一个数组存...原创 2021-04-11 22:22:12 · 179 阅读 · 0 评论 -
二叉树的基本概念
目录一、概念定义特点:二、几种特殊的二叉树满二叉树:特点:完全二叉树特点:二叉排序树平衡二叉树小结:下一篇:一、概念定义二叉树是n(n>=0)个结点的有限集合1、或者为空二叉树,n=02、或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一颗二叉树特点:1、每个结点至多只有两颗子树2、左右子树不能颠倒(是有序树)二、几种特殊的二叉树满二叉树:一颗高度为h且含...原创 2021-04-11 17:16:47 · 235 阅读 · 0 评论 -
树的基本概念
目录一、边、根结点、分支结点二、树的数学概念子树:三、基本术语四、结点、树的属性描述五、有序树V.S无序树六、森林七、树的常考性质八、小结小结1小结2下一篇:一、边、根结点、分支结点1、有且有一个根结点2、无前驱的结点称为叶子结点或称为终端结点3、有后继的结点称为分支结点或称非终端结点4、除了根结点外,任何一个节点都有且仅有一个前驱5、空树∅节点为0的树补充:除了根结点,其他结点都有前驱;除了叶子结点,其他结点都有后继...原创 2021-04-11 16:33:20 · 175 阅读 · 0 评论 -
KMP算法
目录一、KMP思路:汇总:二、代码实现:三、求next数组四、求next数组练习五、计算next数组代码六、小结下一篇:朴素的模式匹配算法指针每次需要前进m步再后退m-1。。。也就是:当某些子串与模式串能部分匹配时,主串的扫描指针i经常回溯,导致时间开销增加一、KMP思路:主串指针不回溯,只有模式串指针回溯匹配失败时如何回溯?从主串从左往右扫描,若子串的指针j与主串的指针i匹配则i++,j++若不匹配则让i++而j指向1...原创 2021-04-11 08:51:31 · 220 阅读 · 0 评论