
数据结构学习
408
Faith_gyz
记录学习过程中的点点滴滴
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数据结构新增内容
并查集红黑树看是LL型,是从爷节点开始,表示爷爷节点的左左方向红黑树特性:左根右 根页黑 黑路同 ,非根节点,只需考虑不红红。爷节点不是根节点,出现了两个18,根据需要放置红黑树任意节点的左 右子树相差不超过两倍,...原创 2021-12-17 22:18:49 · 684 阅读 · 0 评论 -
8.7外部排序
一、外存、内存之间的交换读磁盘,在内存中申请一片空间,其大小可以和磁盘块的大小保持一致,1KB.通过程序代码,修改内存中的内容写磁盘,也是以块为单位,可以将写回,也可以写回别的磁盘块。二、外部排序原理申请的三个缓冲区的大小与磁盘块大小保持一致先将前两个磁盘块写入缓冲区1、2,并对其进行内部排序。将要写回磁盘的缓冲区1的内容写到输出缓冲区,然后写入磁盘每个磁盘块都要进行一次读写操作,总共进行16*2次读写。分别挑选两个归并段中两个较小的,读入内存每次从两个缓冲区中挑选最小原创 2021-07-27 15:06:32 · 841 阅读 · 2 评论 -
8.5归并排序和基数排序
一、归并排序归并排序代码实现此时已经不满足j<=high,接下来到while,将第一个序列中的未扫到的,直接放到A序列中完整代码二、基数排序每个元素都是三位数,而每位取值都是0-9,所以可以开辟10大小的数组,下面时按照个位数进行排序。按照个位递减排序,从左往右开始...原创 2021-07-26 15:40:12 · 101 阅读 · 0 评论 -
8.4选择排序
一、简单选择排序每趟排序从左往右找最小的元素,将其放到头部二、堆排序建立大根堆从后往前处理,检查是每个非叶节点否满足大根堆的特性,从32开始原创 2021-07-25 17:34:50 · 275 阅读 · 0 评论 -
8.3交换排序
一、冒泡排序最坏情况,当最后一个元素移动到首位时,不需要再进行交换,下次交换从2开始,交换n-2次。其他依次二、快速排序开始:low和high分别指向表的首尾元素,使得low所指向的元素49为基准元素,分别向中间扫描,始终保证low左边元素<49,high右边始终>=4949>=49,所以high指针向左移动一个位置,指向27,此时27<49,所以需要将27移动到low所指向的位置此时high指向的元素为空,low元素需要右移动,38<49满足原创 2021-07-24 22:29:49 · 161 阅读 · 1 评论 -
8.2插入排序
一、直接插入排序从i左边开始比较,如果比i所在元素大,则右移动。当j< 0,时结束。你看你想要什么操作了,你若是紧紧想让j的值减1,那么就没差别,你若是想要这两个操作的返回值,就不一样,j–返回的是j的值,而–j返回的是j-1后的值也就是说这两个表达式对j的操作是一样的,就是返回的值不同二、优化–折半插入排序查找完成之后 high在low左边,high+1=low三、希尔排序n=8,n/2=4,相距为4的看成一个子表。对每个子表进行直接插入排序原创 2021-07-24 16:43:20 · 81 阅读 · 0 评论 -
7.4散列表
一、散列表的基本概念二、散列函数的构造方法1、除留余数法下面那个散列表,因为取余的范围只能在0-12,所以最后那两个空了出来这里出现一个疑惑,使用最大质数7进行取余,反而冲突更多了?2、直接定址法这种方式虽然分布的均匀,但还是可能发生冲突。三、处理冲突的方法1、拉链法基于拉链法的查找一共有12个元素,这些个链表第一层有6个,二层有4个。。。。上面两个式子一样,但是下面的式子反映了冲突次数理想状态下,没有冲突下面是查找失败的平均查找次数and装填因子①原创 2021-07-23 21:46:33 · 398 阅读 · 0 评论 -
7.3B树和B+树
一、B树如何查找每个结点的查找也可以使用折半查找查找效率1这里是除了根结点,不是不保证,实际上是做不到查找效率2B树定义B树的插入B树的删除使用直接前驱取代非终端节点,完成删除如果要删除80使用77取代80的位置使用直接后继取代非终端节点特殊情况:删除终端节点之后,关键字的个数低于下限将49移到删除的位置,将70取代49当右兄弟手头紧的时候,找左兄弟。将92的直接前驱放到92的前面,将92前驱的前驱取代88原创 2021-07-23 16:10:54 · 256 阅读 · 0 评论 -
7.1查找and7.2顺序查找和折半查找
一、查找定义二、顺序查找数组下标为0的位置存储要找的数,从最后一个位置开始查找成功,每个数据的概率是n分之一,查第一个比较次数是1,第二个次数是2.。。。顺序查找的优化1共有n+1个结点,所以共有n+1种查找失败的情况当经常查找成功时,可以把查找概率高的放到前面。看情况而定三、折半查找这里的代码是基于升序的设计的折半二叉树构造如果mid向下取整,则会、、如上查找成功或失败的比较次数都不会超过树高h只能说折半查找大部原创 2021-07-22 13:29:50 · 339 阅读 · 0 评论 -
6.4图的应用
一、最小生成树Prim算法从p城开始①将代价最小的树依次纳入生成树中②代价最小的是学校,为1,其次是矿场和渔村,都为4,选择一个先,比如选择矿场,依次。。。。。可能有多个最小生成树从农场开始,生成树一样kruskal算法①最开始选择权值为1的那条边,将其两个顶点连接,其次选择3,4进行连接,连接4的时候选择那一条都可以,因为P城市与渔村已经连接起来,所以不会再将另外那个4连接,别的也是v3加入之后,v1加入的代价变为了5,记得更新连接之前,两个顶点分属两个集合,连原创 2021-07-21 17:16:31 · 278 阅读 · 0 评论 -
6.3图的遍历
一、广度优先遍历对于上面的代码,无法访问非连通图,这时候新定义一个函数,在数组进行查找,找到的第一个为 false的,则使其为初始顶点执行BFS函数最坏情况是;将所有顶点都放到辅助队列中,所有顶点都和1有关除了访问顶点之外,还要访问与之相邻的边二、深度优先遍历最开始访问根结点1,在访问2,其次5,5没有子树,返回2,判断2有子树,访问6,再返回2,再返回1,然后访问3,再返回1,再访问4.。。。从2开始,找到其第一个相邻顶点1,其次是5,5访问之后,没有相邻顶点,原创 2021-07-20 12:54:59 · 115 阅读 · 0 评论 -
6.2图的存储结构及基本操作
一、邻接矩阵法顶点信息在数组中的存储会有一个固定的下标,他会与二维数组Edge相对应已知对应的两顶点之间不存在边,可以用0或者无穷图中指的是 从A到D如果长度为2,则路径只有1条二、邻接表法三、十字链表、邻接多重表四、图的基本操作对于邻接矩阵可以找到两点之间是否有边邻接表最好情况是第一个指向的就是,最坏的情况是这个点有v-1条与之相连的边。邻接矩阵删除一个顶点,加上一个bool进行判空,删除对应的行和列邻接表:①最好情况:要删除的顶点原本原创 2021-07-19 10:11:26 · 162 阅读 · 0 评论 -
6.1图的基本概念
一、图的基本概念对于生成子图可以去掉某些边原创 2021-07-18 22:03:52 · 78 阅读 · 0 评论 -
5.5树与二叉树的应用
一、二叉排序树这是非递归的实现从根结点出发删除13之后,只需要其子树替代即可要删除的结点左右子树都有,则找其右子树中序遍历第一个被访问的结点(最左下的结点,即右子树中最小的值),替代该节点,得到结果如下:删除的第二种方法:如下比如查找70这个节点,需要三次对比。放在代码中,就是进行了三次循环或递归。查找失败,表示最后指针停在null上,共有9种结果。二、平衡二叉树1、定义二叉树保持平衡,其查找效率可以达到0(log n)2、插入新节点导致的平衡二原创 2021-07-18 14:01:45 · 392 阅读 · 0 评论 -
5.4树、森林
PTNode是各个结点组成的数组,每一个结点当中保存了数据和指向双亲的指针,这里定义了一个int型指针,其实际上储存了双亲结点在数组中的存放下标。删除结点G,方案一:将其指向双亲的指针设为-1,表示其为空的方案二:将尾部的元素填充删除的空白删除一个结点,记得-1以上删除的G是叶结点,如果删除的不是叶结点,如删除D,还要删除其子孙节点,这时候需要查询操作找到其子孙。如果删除的结点未被填充,产生的空数据会使遍历更慢,。二叉树当然也是树,也可以用双亲表示法表示。这种方式找双亲就麻..原创 2021-07-17 23:00:37 · 77 阅读 · 0 评论 -
5.3二叉树的遍历和线索二叉树
一、二叉树按序遍历算法复杂度为:O(h+1) h是二叉树的高度,1是最后的叶子节点有左右两个空结点,也需要将其压入栈。二、二叉树层次遍历结点出队并访问该节点,其左右孩子入队对于E来说,其没有左右孩子,访问完E之后不会有结点入队访问一个节点,存的是其指针而不是结点三、由遍历序列构造二叉树可以由以上三种方法唯一确定二叉树首先可以根据前序遍历发现A是根节点①首先前序遍历=>D是根节点,②再看中序遍历可得D的左侧是其左子树,右侧是右子树。.原创 2021-07-16 18:47:11 · 431 阅读 · 0 评论 -
5.2二叉树的概念
一、二叉树定义及性质当完全二叉树有13个节点时,【n/2】向下取整,也会满足二叉排序树,比如要找关键字为60的序号,60>19,所以可以直接找到右子树上,60>50,再找右子树,而60<66,这次找到左子树。胖胖的、丰满的树进行搜索的时候,更加方便。二、二叉树的存储结构①对于普通二叉树,判断i是否有左孩子,要用isEmpty函数判断对于一个非完全二叉树的二叉树,如果使用顺序存储会造成大量空间的浪费。实际应用当中很少使用顺序存储。①如果一原创 2021-07-15 21:26:25 · 170 阅读 · 0 评论 -
5.1树的基本概念
这里节点层次默认从1开始,有的地方会从0开始原创 2021-07-15 14:14:22 · 198 阅读 · 0 评论 -
第四章 串
一、串的定义注意:11 pro 是主串的一个子串,其地址是其第一个字符的地址 ,“1”计算机比较字符串的时候,比较二者对应的二进制数谁更大解析方式不对,出现乱码问题二、串的存储结构方案二缺点:由于每个字符占1B,所以只能表示的大小是0-255第二种方式推荐,存储密度提高。如果最后一个节点存储不完,可以用“#”或者“\0”进行填充三、串的模式匹配算法刚开始时,i和j都指向第一个位置,若字符匹配成功,则i和j都加1若匹配失败,则主串指针i指向下一个字串原创 2021-07-13 22:30:19 · 264 阅读 · 0 评论 -
3.4特殊矩阵的压缩存储
一、数组我们规定行优先或者是列优先,本质是想把非线性的二维数组,拉成线形这样的形状(计算机内存的存储空间是线性的),那把这些数据有规律的存到内存之中,所带来的好处是随机存取。如果想要访问二维数组中的某一个数据元素的话,那么只需要给出这个元素所对应的行号和列号,计算机就可以根据行号和列号计算出对应元素的存放地址二、矩阵的压缩存储1、对称矩阵压缩可以实现一个映射函数,使矩阵和数组一一对应aij是第几个元素,(1+2+…+i-1)+j这里要注意:k那里要不要减一,具体要看数组下标是从0.原创 2021-07-13 17:06:09 · 443 阅读 · 0 评论 -
3.3栈和队列的应用
一、栈的应用①:看左边的图,从左往右数最后出现的左括号是④,接下来是右括号④,从而④率先被匹配。②:右图所示,当遇到左括号时,将其压入栈中,当遇到右括号,就将栈顶的左括号弹出,检查他们俩是否匹配。遇到不匹配的就算是失败了,不用继续扫描了。从这个例子中可以看出,写代码的时候,在扫描完成之后需要检查栈是否为空,如果不为空,说明“失败了”二、栈在表达式求值中的应用...原创 2021-07-11 22:36:27 · 146 阅读 · 0 评论 -
3.2 队列
当队尾指针指向最后一个元素的时候,进行取余运算,由数组下标为9的位置到数组下标为0的位置如果队头和队尾指针指向同一个位置,则表示队列为空,所以只能牺牲掉一个位置。当队尾指针指向队尾元素,其初始化:队头指针指向0,队尾指针指向n-1......原创 2021-07-10 21:58:54 · 424 阅读 · 0 评论 -
3.1 栈
一、栈1、栈的定义2、栈的基本操作原创 2021-07-02 17:11:35 · 79 阅读 · 0 评论 -
线性表学习
test里面的x是main里面的x的复制品,在内存当中是两份不同的数据加上引用符号之后,就是一个x了原创 2021-06-06 19:50:01 · 269 阅读 · 0 评论