- 博客(91)
- 收藏
- 关注
原创 数据结构(8.7_1)——外部排序
输出缓冲区1空了用归并段1的下一块元素补上 ..... 顺序的两个归并段方法一样..... 由于文件总块数无法改变,所以只能对归并趟数进行改变 注意:k不能无限增大、若k太大了也会增加内部归并所需时间在缓冲区内直接排序
2024-11-03 22:57:39
263
原创 数据结构(8.5_2)——基数排序
第一趟“分配”:按"个位"进行分配第一趟“收集”: 第二趟“分配”:按"十位"进行分配("个位"越大的越先入队) 第二趟“收集”: 第三趟“分配”:按"百位"进行分配("十位"越大的越先入队) 第三趟“收集”: 总的来看: 空间复杂度:O(r) 需要r个辅助队列 时间复杂度:O(d(n+r))一趟分配O(n),一趟收集O(r),总共d趟分配、收集 稳定性:稳定 d=3;n=10000;r=31或12、或14 d必须要小,反例: r较小的反例:数据元素个数n的例子:通常基于链式表的前题:考基数排序的手
2024-11-01 21:06:42
278
原创 数据结构(8.5_1)——归并排序
归并:把两个或多个已经有序的序列合并成一个归并后:把两个或多个已经有序的序列合并成一个m路归并,每选出一个元素需要对比关键字m-1次 2路归并的“归并树”——形态上就是一棵倒立的二叉树稳定的算法
2024-10-31 22:41:50
345
原创 数据结构(8.3_2)——快速排序
设置两个指针,一个i指针初值为low和一个j指针初值为high,j指针从左往右移,当j指向的元素小于枢轴元素,将该元素放到枢轴元素左边,i指针从右往左移,当i指向的元素大于枢轴元素,将该元素放到枢轴元素右边 从上图可知49已经排序完,并且将左右两边分为了两个子表,接下来再对两个子表进行快速排序 左子表: 右子表:接下来的步骤继续将76划分为左右两个子表,继续进行快速排序代码解释:首先需要一个递归调用栈 进入第一层的QuickSort函数,传入数据和划分左右子表,low=0,high=7,#96表示代
2024-10-22 00:02:13
722
原创 数据结构(8.3_1)——冒泡排序
从行往前将A[i-1]和A[i]比较若遇到A[i-1]>A[i]则将两个元素交换。每次交换都需要移动元素3次。
2024-10-21 22:18:28
295
原创 数据结构(8.2_2)—希尔排序
第一趟:先将在排序表中根据增量di分别将数组元素分别插入各个子表 ,在进行排序 代码实现: 稳定性:不稳定!适用性:仅适用于顺序表,不适用于链表
2024-10-21 21:46:50
290
原创 数据结构(8.2_1)——插入排序
算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排序好的子序列中,直到全部记录插入完成。 代码实现 (带哨兵) 空间复杂度:O(1)时间复杂度:主要来自对比关键字,移动元素,若有n个元素,则需要n-1趟处理最好情况:共n-1趟处理,每一趟只需要对比关键字1次,不用移动元素———O(n)最坏情况:第1趟:对比关键字2次,移动元素3次第2趟:对比关键字3次,移动元素4次...第i趟:对比关键字i+1次,移动元素i+2次———O(n^2)平均时间复杂度:O(n^2) 思路:先用折半查找
2024-10-17 23:22:01
549
原创 数据结构(7.5_1)——散列查找
散列表,又称哈希表,是一种数据结构,特点是:数据元素的关键字与其存储地址直接相关散列函数(哈希函数):Hash(key)=Addr(这里的地址可以是数组下标、索引或内存地址等)
2024-10-15 20:20:56
382
1
原创 数据结构(7.3_5)——红黑树的插入和删除
注意:插入时候重点考察“不红红”特性(红黑树的性质) 染色:哪几个结点有变动就红的变黑,黑的变红RR、LL、LR、RL从爷结点开始算起非根结点的插入只需要判断是否违背的“不红红”特性练习:
2024-09-24 00:07:19
294
原创 数据结构(7.3_4)——红黑树的定义和性质
红黑树的二叉排序树左子树结点值<=根结点值<=右子树结点值每个结点或是红色,或是黑色的根结点是黑色的叶结点(外部结点,NULL结点失败结点)均是黑色的不存在两个相邻的红结点(即红结点的父结点和孩子结点均是黑色的)对每个结点,从该节点到任一叶结点的简单路径上,所含黑结点的数目相同口诀:左根右,根叶黑,不红红,黑路同struct RBnode {//红黑树的结点定义int key;//关键字的指针//父节点指针//左、右孩子指针int color;//结点颜色。
2024-09-22 17:05:22
393
原创 数据结构(7.3_3)——平衡二叉树的删除
删除结点后,要保持二叉排序树的特性不变(左<中<右)若删除结点导致不平衡,则需要调整平衡1、寻找最小不平衡子树2、没找到最小不平衡子树,结束查询1、删除结点552、寻找最小不平衡子树3、找最小不平衡树下,“个头”最高的儿子、孙子 4、根据孙子的位置,调整平衡(LL/RR/LR/RL) 5、检查不平衡性是否向上传导 1、删除结点2、寻找最小不平衡子树3、找最小不平衡树下,“个头”最高的儿子、孙子 4、根据孙子的位置,调整平衡(LL/RR/LR/RL) 5、检查不平衡性是否向上传导 1、删除结点2、寻找最
2024-09-17 18:46:39
618
原创 数据结构(7.3_2)——平衡二叉树
平衡二叉树,简称平衡树(AVL树)----树上任一结点的左子树和右子树的高度之差不超过1.结点的平衡因子=左子树高-右子树高平衡二叉树的插入 在二叉排序树中插入新结点后,如何保持平衡? 1、 2、 3、
2024-09-16 19:25:44
474
原创 数据结构(7.3_1)——二叉排序树
又称左子树结点值<根结点值<右子树结点值进行中序遍历,可以得到一个递增的有序序列二叉排序树可用于元素的有序组织,搜索。
2024-09-14 00:26:33
568
原创 数据结构(7.2_3)——分块查找
分块查找,又称索引顺序查找,算法过程如下:"索引表"中保存每个分块的最大关键字和分块存储区间特点:块内无序,块间有序 查找成功:若索引表中不包含目标关键字,则折半查找索引表最终停在low>high,要在low所指分块中查找 查找失败的例子:
2024-09-11 23:17:48
485
原创 数据结构(7.2_1)——顺序查找
顺序查找,又叫"线性查找",通常用于线性表(或者顺序表和链表)。算法思想:从头到尾全部查找出来(或者反过来也OK)查找成功: 查找失败: 查找成功的情况: 查找失败的情况: ”哨兵“方法查找的优点:无需判断是否越界,效率更高默认每个元素的查找概率为1/n 一个成功结点的查找长度=自身所在层数一个失败结点的查找长度=其父节点所在层数默认情况下,各种失败情况或成功情况都等概率发生 将概率大的元素优先放到前面(使用降序排列)
2024-09-10 21:08:36
655
原创 数据结构(7.1)——查找的基本概念
查找——在数据结构集合中寻找满足某种条件的数据元素的过程称为查找查找表(查找结构)——用于查找的数据集合称为查找表,它由同一类型的数据元素(或记录)组成关键字——数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结国应该是唯一的。例1:例2: 静态查找表: 只需进行一个操作,不进行其他操作动态查找表: 进行该操作的时候,会改变其他数据元素查找长度——在查找运算中,需要对比关键字的次数称为查找长度评价查找长度(ASL,Average Search Length) —— 所有查找过程中进行关键
2024-09-09 22:44:09
232
原创 数据结构(6.4_7)——关键路径
在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如完成活动所需的时间),称之为用边表示活动的网络,简称AOE网(Activity On Edge NetWork)在AOE网中,仅有一个入度为0的顶点,称为开始顶点(源点),它表示整个工程的开始;也仅有一个出度为0的顶点,称为结束顶点(汇点),它表示整个工程的结束从源点到汇点的有向路径可能有多条,所有路径中,具有最大路径长度 的路径称为关键路径,而把关键路径上的活动称为关键活动完成整个工程的最短时间就是关键路径的长度,若关键
2024-09-06 22:49:28
468
原创 数据结构(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
446
原创 数据结构(6.4_5)——有向无环图
有向无环图:若一个有向图中不存在环,则称为有向无环图,简称DAG图(Directed Acyclic Graph)
2024-09-03 19:49:28
346
原创 数据结构(6.4_4)——Floyd算法
第一步:建立两个二维数组,一个用来存放所有顶点,一个用来存放顶点之间的中转点第二步:循环遍历A矩阵,若,则,;否则和保持原值,循环完所有i,j后更新数组并且k+1第三步:重复第二步操作初始:第0轮:第一轮: 第二轮: 总: 代码实现: 时间复杂度和空间复杂度: 1、v0;v1;v2; v3; v4; 循环后无顶点需要更新寻找v0——v4
2024-08-29 22:41:43
496
原创 数据结构(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
354
原创 数据结构(6.3_2)——图的深度优先遍历
树的深度优先遍历分为先根遍历和后根遍历。代码(只能遍历连通图) DFS算法(Final版)代码复杂度分析空间复杂度
2024-08-25 15:41:23
342
原创 数据结构(6_2_3)——十字链表法和多重领接表
橙色入度,绿色出度 代码示例: 十字链表法性能分析 优点:每一条边只对应一个边结点,没有冗余数据,删除结点或者删除边的时候会方便很多 代码示例:总结:
2024-08-20 12:14:20
590
原创 数据结构(6.2_2)——领接表法
代码: 有多少边结点就有多少度有向图的度=入度+出度出度:遍历顶点:对于图中的每个顶点 :a. 遍历边:遍历顶点 的所有出边(即所有形式为 的边,其中 是另一个顶点)。b. 计数:对于每一条出边,将顶点 的出度计数增加1。 入度:遍历边:遍历图中的所有边 :例如寻找入度a的弧,遍历完后找到所有指向0的弧 图的领接表表示方式不唯一图的领接矩阵表示方式唯一
2024-08-18 15:04:28
387
原创 数据结构(6.2_1)——领接矩阵法
邻接矩阵(Adjacency Matrix)是一种使用二维数组来表示图的方法。在这种表示法中,矩阵的行和列都对应图的顶点。 第i个结点的度=第 i 行(或第i列)的非零元素个数时间复杂度=O(n)第i个结点的出度=第 i 行的非零元素个数第i个结点的入度=第 i 列的非零元素个数第i个结点的度=第 i 行、第i列的非零元素个数之和带权图(网)是指图中每条边都有一个与之相关的权重。在邻接矩阵法中,带权图的存储可以通过将邻接矩阵中的元素设置为边的权重来表示。以下是带权图(网)使用邻接矩阵存储的详细说明。若出现
2024-08-17 15:49:37
894
空空如也
iOS开发中该如何实现只有三个线程的递增数列的打印并且重复循环到一百
2022-09-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人