阳光开朗男孩
躺平才是王道
展开
-
最佳归并树
文件经过置换-选择排序后,得到的是长度不等的初始归并段。下面讨论如何组织初始归并段的归并顺序,使I/O访问次数最少。m路归并排序可用一棵m叉树描述。因为每次做m路归并都需要有m个归并段参加,因此归并树是一棵只有度为0和度为m的结点的严格m叉树。设由置换选择得到9个初始归并段,其长度(记录数)依次为9, 30, 12, 18, 3, 17, 2, 6, 24。现做3路平衡归并,其归并树如图7.10所示。在图7.10中,各叶结点表示参加归并的一个初始归并段,叶结点上的权值表示该初始归并段中的记录数,根结点原创 2021-06-06 22:54:46 · 2657 阅读 · 0 评论 -
置换-选择排序
设初始待排文件为FI,初始归并段文件为FO,内存工作区为WA,内存工作区可容纳w个记录。置换-选择算法的步骤如下:1)从待排文件FI输入w个记录到工作区WA。2)从内存工作区WA中选出其中关键字取最小值的记录,记为MINIMAX (以后再选出关键字比它大的记录归入本归并段,比它小的归入下一归并段)。3)将MINIMAX记录输出到FO中。4)若F未读完,则从F输入下一个记录到WA中。5)从WA中所有关键字比MINIMAX记录的关键字大的记录中选出最小的关键字记录,作为新的MINIMAX。6)重复3原创 2021-06-06 22:54:33 · 1422 阅读 · 0 评论 -
败者树
在上节讨论过,归并趟数S=⌈logmr⌉,增加归并路数m可以减少归并趟数S,进而减少访问外存的次数(I/O次数)。然而,增加归并路数m时,内部归并的时间将增加。做内部归并时,在m个元素中选择关键字最小的记录需要比较m-1次。每趟归并n个元素需要做(n-1)(m-1)次比较,S趟归并总共需要的比较次数为S(n-1)(m-1)=⌈logmr⌉(n-1)(m-1)=⌈logmr⌉(n-1)(m-1)/⌈log2m⌉式中,⌈logmr⌉(n-1)在初始归并段个数r与记录个数n定时是常数,而(m-1)/⌈log2原创 2021-06-06 22:54:05 · 4983 阅读 · 1 评论 -
外部排序
外部排序的基本概念前面介绍过的排序方法都是在内存中进行的(称为内部排序)。而在许多实际应用中,经常需要对大文件进行排序,因为文件中的记录很多、信息量庞大,无法将整个文件复制进内存中进 行排序。因此,需要将待排序的记录存储在外存上,排序时再把数据一部分 一部分地调入内存进行排序。在排序过程中需要多次进行内存和外存之间的交换,对外存文件中的记录进行排序后的结果仍然被放到原有文件中。这种排序方法就称为外部排序。外部排序的方法在实际应用中,由于外存设备的不同,通常又可分为磁盘文件排序和磁带文件排序两大类。磁带原创 2021-06-06 22:53:45 · 1338 阅读 · 0 评论 -
基数排序
基数排序是种很特别的排序方法,它不基于比较进行排序,而采用多关键字排序思想(即基于关键字各位的大小进行排序),借助“分配”和“收集”两种操作对单逻辑关键字进行排序。基数排序又分为最高位优先(MSD)排序和最低位优先(LSD)排序。以r为基数的最低位优先基数排序的过程:假设线性表由结点序列a0, a1,…,an-1构成,每个结点aj的关键字由d元组(kjd-1, kjd-2,…,kj1, kj2 )组成,其中0≤kji≤r- 1(0≤j<n, 0≤i≤d-1)。在排序过程中,使用r个队列Q0, Q1,原创 2021-06-06 22:52:52 · 718 阅读 · 0 评论 -
归并排序
归并排序与上述基于交换、选择等排序的思想不一样,“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。假定待排序表含有n个记录,则可将其视为n个有序的子表, 每个子表的长度为1,然后两两归并,得到⌈n/2⌉个长度为2或1的有序表;再两两…如此重复,直到合并成一个长度为n的有序表为止,这种排序方法称为2路归并排序。图7.4所示为2路归并排序的一个例子。Merge()的功能是将前后相邻的两个有序表归并为一个有序表。设两段有序表A[low…mid]、 A [mid+1…high]存放在同一顺序表中的相邻原创 2021-06-06 22:51:40 · 195 阅读 · 0 评论 -
堆的插入删除
同时,堆也支持删除和插入操作。由于堆顶元素或为最大值或为最小值,删除堆顶元素时,先将堆的最后一一个元素与堆顶元素交换,由于此时堆的性质被破坏,需对此时的根结点进行向下调整操作。对堆进行插入操作时,先将新结点放在堆的末端,再对这个新结点执行向上调整操作。大根堆的插入操作示例如图7.3所示。void AdjustUp(ElemType A[], int k){//参数k为向上调整的结点,也为堆的元素个数 A[0]=A[k]; int i=k/2; //若结点值大于双亲结点,则将双亲结点向下原创 2021-06-06 22:51:17 · 500 阅读 · 0 评论 -
堆排序
堆排序是一种树形选择排序方法,其特点:在排序过程中,将L[1…n]视为一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的元素。堆的定义如下: n个关键字序列L[1…n]称为堆,当且仅当该序列满足:① L(i)≤L(2i)且L(i)≤L(2i+1)或② L(i)≥L(2i)且L(i)≥L(2i+1) (1≤i≤⌊n/2⌋)满足第①种情况的堆称为小根堆(小顶堆),满足第②种情况的堆称为大根堆(大顶堆)。显然,在大根堆中,最大元素存放在根结原创 2021-06-05 13:43:56 · 253 阅读 · 0 评论 -
简单选择排序
根据上面选择排序的思想,可以很直观地得出简单选择排序算法的思想:假设排序表为L[1…n],第i趟排序即从L[i…n]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可使得整个排序表有序。void SelectSort(ElemType A[], int n){//对表A做简单选择排序,A[]从0开始存放元素 for(i=0; i<n-1; i++) { min=i; for(j=i+1; j<原创 2021-06-05 11:57:34 · 205 阅读 · 0 评论 -
快速排序
快速排序是对冒泡排序的一种改进, 其基本思想是基于分治法的:在待排序表L[1…n]中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1…k-1]和 L[k+1…n],使得L[1…k-1]1中的所有元素小于pivot, L[k+1…。n]中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一趟快速排序。而后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。首先假设划分算法已知,记为Partition(原创 2021-06-05 11:49:45 · 3205 阅读 · 0 评论 -
冒泡排序
冒泡排序算法的基本思想是:假设待排序表长为n,从后往前(或从前往后) 两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。我们称它为一趟冒泡,结果是将最小的元素交换到待排序列的第一个位置(关键字最小的元素如气泡般逐渐往上“漂浮”直至“水面”,这就是冒泡排序名字的由来)。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序列减少一个元素,每趟冒泡的结果是把序列中的最小元素放到了序列的最终位…这样最多做n-1趟冒泡就能把所有元素排好序。算法代码如下:void Bub原创 2021-06-05 11:24:55 · 774 阅读 · 0 评论 -
希尔排序
从前面的讲解不难看出,直接插入排序算法适用于基本有序的排序表和数据量不大的排序 表。基于这两点,提出了希尔排序,又称缩小增量排序。希尔排序的基本思想是:先将待排序表分割成若干形如L[i,i+d,i+2d,…,i+kd]的“特殊”子表,分别进行直接插入排序,当整个表中的元素已呈“基本有序”时,再对全体记录进行一次直接插入排序。希尔排序的排序过程如下:先取一个小于n的步长d1,把表中的全部记录分成d1组,所有距离为d1的倍数的记录放在同一组中,在各组中进行直接插入排序;然后取第二个步长d2<d1,重复原创 2021-06-05 11:10:25 · 1015 阅读 · 0 评论 -
插入排序
直接插入排序根据上面的插入排序思想,不难得出一种最简单也最直观的直接插入排序算法。假设在排序过程中,待排序表L[1…n]在某次排序过程中的某一时刻状态如下:要将元素L(i)插入到已有序的子序列L[1…i-1]中,需要执行以下操作(为避免混淆,下面用L[]表示一个表,而用L()表示一个元素):1)查找出L(i)在L[1…i-1]中的插入位置k。2)将L[k…i-1]中的所有元素全部后移一个位置。3)将L(i)复制到L(k)。为了实现对L[1…n]的排序,可以将L(2)~L(n)依次插入到前面已排好原创 2021-06-05 10:42:07 · 288 阅读 · 0 评论 -
排序的基本概念
排序的定义排序,就是重新排列表中的元素,使表中的元素满足按关键字递增或递减的过程。为了查找方便,通常要求计算机中的表是按关键字有序的。排序的确切定义如下:输入:n个记录R1,R2,…,Rn,对应的关键字为ki,k2,…,kn。输出:输入序列的一个重排R1’,R2’,…,Rn’,使得有ki≤k2’≤…≤kn’, (其中“≤”可以换成其他的比较大小的符号)。算法的稳定性。若待排序表中有两个元素Ri和Rj,其对应的关键字keyi=keyj,且在排序前Ri在Rj的前面,若使用某一排序算法排序后,Ri仍然在R原创 2021-06-05 10:17:05 · 319 阅读 · 0 评论 -
散列查找
散列函数:一个把查找表中的关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr(这里的地址可以是数组下标、索引或内存地址等)。散列函数可能会把两个或两个以上的不同关键字映射到同一地址,称这种情况为冲突,这些 发生碰撞的不同关键字称为同义词。一方面, 设计得好的散列函数应尽量减少这样的冲突;另一方面,由于这样的冲突总是不可避免的,所以还要设计好处理冲突的方法。散列表:根据关键字而直接进行访问的数据结构。也就是说,散列表建立了关键字和存储地址之间的一种直接映射关系。理想情况下,对散列表进原创 2021-06-05 10:09:50 · 3213 阅读 · 1 评论 -
B+树
B+树是应数据库所需而出现的一种B树的变形树。一棵m阶的B+树需满足下列条件:1)每个分支结点最多有m棵子树(子结点)。2)非叶根结点至少有两棵子树,其他每个分支结点至少有⌈m/2⌉棵子树。3)结点的子树个数与关键字个数相等。4)所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小顺序排列,并且相邻叶结点按大小顺序相互链接起来。5)所有分支结点(可视为索引的索引)中仅包含它的各个子结点(即下一级的索引块)中关键字的最大值及指向其子结点的指针。m阶的B+树与m阶的B树的主要差异如原创 2021-06-05 00:08:50 · 298 阅读 · 0 评论 -
B树的插入删除
查找与二叉查找树的插入操作相比,B树的插入操作要复杂得多。在二又查找树中,仅需查找到需插入的终端结点的位置。但是,在B树中找到插入的位置后,并不能简单地将其添加到终端结点中,因为此时可能会导致整棵树不再满足B树定义中的要求。将关键字key插入B树的过程如下:1)定位。利用前述的B树查找算法,找出插入该关键字的最低层中的某个非叶结点(注意,B树中的插入关键字一定插入在最低层中的某个非叶结点内)。2)插入。在B树中,每个非失败结点的关键字个数都在区间[⌈m/2⌉-1, m-1]内。插入后的结点关键字个数小原创 2021-06-05 00:02:14 · 728 阅读 · 0 评论 -
B树
B树,又称多路平衡查找树,B树中所有结点的孩子结点数的最大值称为B树的阶,通常用m表示。一棵m阶B树或为空树,或为满足如下特性的m叉树:1)树中每个结点至多有m棵子树(即至多含有m-1个关键字)。2)若根结点不是终端结点,则至少有两棵子树。3)除根结点外的所有非叶结点至少有「m/21棵子树(即至少含有「m/27- 1个关键字)。4)所有非叶结点的结构如下:其中,K; (i=1,2,n)为结点的关键字,且满足K1<K2<…<Kn;Pi(i=0,1,…,n)为指向子树根结点的指针,且原创 2021-06-04 23:46:42 · 547 阅读 · 0 评论 -
分块查找
分块查找又称索引顺序查找,它吸取了顺序查找和折半查找各自的优点,既有动态结构,又适于快速查找。分块查找的基本思想:将查找表分为若干子块。块内的元素可以无序,但块之间是有序的,即第一个块中的最大关键字小于第二个块中的所有记录的关键字,第二个块中的最大关键字小于第三个块中的所有记录的关键字,以此类推。再建立-一个索引表,索引表中的每个元素含有各块的最大关键字和各块中的第一个元素的地址,索引表按关键字有序排列。分块查找的过程分为两步:第一步是在索引表中确定待查记录所在的块,可以顺序查找或折半查找索引表;第二步原创 2021-06-03 17:43:28 · 7624 阅读 · 0 评论 -
折半查找
折半查找又称二分查找,它仅适用于有序的顺序表。基本思路是:首先将给定值key与表中中间位置元素的关键字比较,若相等,则查找成功,返回该元素的存储位置;若不等,则所需查找的元素只能在中间元素以外的前半部分或后半部分(例如,在查找表升序排列时,若给定值key大于中间元素的关键字,则所查找的元素只可能在后半部分)。然后在缩小的范围内继续进行同样的查找,如此重复,直到找到为止,或确定表中没有所需要查找的元素,则查找不成功,返回查找失败的信息。int Binary_Search(SeqList L, ElemTyp原创 2021-06-03 16:04:05 · 8439 阅读 · 1 评论 -
顺序查找
顺序查找又称线性查找,主要用于在线性表中进行查找。顺序查找通常分为对一般的无序线性表的顺序查找和对按关键字有序的顺序表的顺序查找。下面分别进行讨论。1.一般线性表的顺序查找作为种最直观的查找方法, 其基本思想是从线性表的一端开始,逐个检 查关键字是否满足给定的条件。若查找到某个元素的关键字满足给定条件,则查找成功,返回该元素在线性表中的位置;若已经查找到表的另一端,但还没有查找到符合给定条件的元素,则返回查找失败的信息。下面给出其算法,主要是为了说明其中引入的"哨兵"的作用。typedef struc原创 2021-05-27 17:39:54 · 5262 阅读 · 0 评论 -
查找的基本概念
查找。在数据集合中寻找满足某种条件的数据元素的过程称为查找。查找的结果一般分为两种:一是查找成功,即在数据集合找到了满足条件的数据元素;二是查找失败。查找表(查找结构)。用于查找的数据集合称为查找表,它由同一类型的数据元素(或记录)组成,可以是一个数组或链表等数据类型。对查找表经常进行的操作一般有4种:①查询某个特定的数据元素是否在查找表中;②检索满足条件的某个特定的数据元素的各种属性;③在查找表中插入一个数据元素;④从查找表中删除某个数据元素。静态查找表。若一个查找表的操作只涉及上述操作①和②,则无须原创 2021-05-27 17:12:54 · 351 阅读 · 0 评论 -
关键路径
在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如完成活动所需的时间),则称这种有向图为用边表示活动的网络,简称为AOE网。AOE网具有以下两个性质:① 只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始;② 只有在进入某一顶点的各有向边所代表的活动都已结束时,该顶点所代表的事件才能发生。在AOE网中仅有一个入度为0的顶点,称为开始顶点(源点),它表示整个工程的开始:网中也仅存在一个出度为0的顶点,称为结束顶点(汇点), 它表示整个工程的结束。原创 2021-05-21 21:33:08 · 1562 阅读 · 0 评论 -
拓扑排序
拓扑排序:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序:① 每个顶点出现且只出现一次。② 若顶点A在序列中排在顶点B的前面,则在图中不存在从顶点B到顶点A的路径。或者定义为:拓扑排序是对有向无环图的顶点的一种排序,它使得若存在一条从顶点A到顶点B的路径,则在排序中顶点B出现在顶点A的后面。每个DAG图都有个或多个拓扑排序序列。对一个DAG图进行拓扑排序的算法有很多, 下面介绍比较常用的种方法的步骤:① 从DAG图中选择一个没有前驱的顶点并输出。② 从原创 2021-05-21 21:05:47 · 876 阅读 · 1 评论 -
有向无环图描述表达式
有向无环图:若一个有向图中不存在环,则称为有向无环图,简称DAG图。AOV网:若用DAG图表示一个工程,其顶点表示活动,用有向边<Vi, Vj> 表示活动Vi必须先于活动Vj进行的这样种关系,则将这种有向图称为顶点表示活动的网络,记为AOV网。在AOV网中,活动Vi是活动Vj的直接前驱,活动Vj是活动Vi的直接后继,这种前驱和后继关系具有传递性,且任何活动Vi不能以它自己作为自己的前驱或后继。...原创 2021-05-21 20:55:40 · 480 阅读 · 0 评论 -
最小路径问题_Floyd
求所有顶点之间的最短路径问题描述如下:已知一个各边权值均大于0的带权有向图,对每对顶点vi≠vj,要求求出vi与vj之间的最短路径和最短路径长度。Floyd算法的基本思想是:递推产生一个 n阶方阵序列A(-1), A(0),…,A(k),…, A(n-1),其中A(-k)[i][j]表示从顶点vi到顶点vj的路径长度,k表示绕行第k个顶点的运算步骤。初始时,对于任意两个顶点vi和vj,若它们之间存在边,则以此边上的权值作为它们之间的最短路径长度;若它们之间不存在有向边,则以∞作为它们之间的最短路径长度。以原创 2021-05-21 20:49:30 · 652 阅读 · 0 评论 -
最小路径问题_Dijkstra
求带权有问图中某个源点到其余各顶点的最短路径时,最常用的是Dijkstra算法。该算法设置一个集合S记录已求得的最短路径的顶点,可用一个数组s[]来实现,初始化为0,S[vi]=1时表示将顶点[vi放入S,初始时把源点v0放入S。此外,在构造过程中还设置了两个辅助数组:● dist[]:记录从源点v0到其他各顶点当前的最短路径长度,dist[i]的初值为arcs[v0] [i]。● path[]:path[i]表示从源点到顶点i之间的最短路径的前驱结点,在算法结束时,可根据其值追溯得到源点v0到顶点vi原创 2021-05-21 20:30:44 · 393 阅读 · 0 评论 -
最小路径问题_BFS
广度优先搜索查找最短路径只是对无权图而言的。图是带权图时,把从一个顶点v0到图中其余任意一个顶点vi的一条路径(可能不止一条)所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径长度最短的那条路径称为最短路径。求解最短路径的算法通常都依赖于一种性质,即两点之间的最短路径也包含了路径上其他顶点间的最短路径。带权有向图G的最短路径问题一般可分为两类:一是单源最短路径,即求图中某一顶点到其他各顶点的最短路径,可通过经典的Dijkstra 算法求解;二是求每对顶点间的最短路径,可通过Floyd-Warsh原创 2021-05-21 20:13:47 · 577 阅读 · 0 评论 -
最小生成树
一个连通图是生成树是图的极小连通子图,它包含图中的所有顶点,并且只含尽可能少的边。这意味着对于生成树来说,若砍去它的一条边,则会使生成树变成非连通图;若给它增加一条边,则会形成图中的一条回路。对于一个带权连通无向图G=(V, E), 生成树不同,每棵树的权(即树中所有边上的权值之和可能不同。 设R为G的所有生成树的集合,若T为R中边的权值之和最小的那棵生成树,则T称为G的最小生成树(Minimum-Spanning Tee MST)。不难看出, 最小生成树具有如下性质:1)最小生成树不是唯一的,即最小原创 2021-05-21 14:57:24 · 5004 阅读 · 0 评论 -
深度优先搜索
深度优先搜索类似于树的先序遍历。思想:首先访问图中某一起始顶点v,然后由v出发,访问与v邻接且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2·····重复上述过程。当不能再继续向下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直到图中所有顶点均被访问过为止。bool visited[MAX_VERTEX_NUM];void DFSTraverse(Graph G){ for(v=0; v<G.vexnum; ++v)原创 2021-05-20 17:31:24 · 503 阅读 · 0 评论 -
广度优先搜索
广度优先搜索类似于二叉树层次遍历算法,其基本思想是:首先访问起始顶点v,接着由v出发,依存访问v的各个未访问过的邻接顶点w1,w2,…,wi,然后依次访问w1,w2,…,wi的所有未被访问过的邻接顶点;再从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点······依次类推,直到图中所有顶点都被访问过为止。Dijkstra单源最短路径算法和Prim最小生成树算法也应用了类似的思想。广度优先搜索是一种分层的查找过程,每向前一步可能访问一批顶点,不像深层优先搜索那样有往回退的情况,因此它不是一个递归的算原创 2021-05-19 18:06:38 · 1812 阅读 · 0 评论 -
图的基本操作
图的基本操作图的基本操作是独立于图的存储结构的。而对于不同的存储方式,操作算法的具体实现会有着不同的性质。图的基本操作主要包括:● Adjacent(G, x, y):判断图 G 是否存在边<x, y>或(x, y)。● Neighbors(G, x):列出图 G 中与结点 x 邻接的边。● InsertVertex(G, x):在图 G 中插入顶点 x。● DeleteVertex(G, x):从图 G 中删除顶点 x。● AddEdge(G, x, y):若无向边(x, y)或原创 2021-05-19 14:55:44 · 168 阅读 · 0 评论 -
十字链表、邻接多重表
十字链表十字链表是有向图的一种链式存储结构。在十字链表中,对应于有向图中的每条弧有一个结点,对应于每个顶点也有一个结点。弧结点中有5个域:尾域(tailvex)和头域(headvex)分别指示弧尾和弧头这两个顶点在图中的位置:链域hlink指向弧头相同的下一条弧;链域tlink指向弧尾相同的下一条弧;info域指向该弧的相关信息。这样,弧头相同的弧就在同一链表上,弧尾相同的弧也在同一个链表上。顶点结点中有3个域:data域存放顶点相关的数据信息,如顶点名称;firstin和firstout两个域分别指原创 2021-05-17 14:07:07 · 1356 阅读 · 0 评论 -
邻接表
邻接表当一个图为稀疏图时,使用邻接矩阵表示显然要浪费大量的存储空间,而图的邻接表法结合了顺序存储和链式存储方法,大大减少了这种不必要的浪费。所谓邻接表,是指对图G中的每一个顶点vi建立一个单链表,第 i 个单链表中的结点表示依附于顶点 vi 的边(对于有向图则是以顶点vi为尾的弧),这个单链表就称为顶点vi的边表(对于有向图则称为出边表)。边表的头指针和顶点的数据信息采用顺序存储(成为顶点表),所以在邻接表中存在两种:顶点表结点和边表结点。顶点表结点由顶点域(data)和指向第一条邻接边的指针(fir原创 2021-05-17 10:38:31 · 20182 阅读 · 0 评论 -
邻接矩阵法
邻接矩阵法邻接矩阵法:指用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵。结点数为n的图G=(V, E)的邻接矩阵A是nxn的。将G的顶点编号为v1, v2,…, vn。若(vi, vj)∈E,则A[i][j]=1,否则A[i][j]=0。对于带权图而言,若顶点vi和vj之间有边相连,则邻接矩阵中对应项存放着该边对应的权值,若顶点Vi和Vj不相连,则用∞来代表这两个顶点之间不存在边#define MaxVertex原创 2021-05-12 10:54:52 · 4478 阅读 · 0 评论 -
图的基本概念
图的定义图G由顶点集V和边集E组成,记为G = (V, E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。若V={v1, v2,…,vn},则用{V}表示图G中顶点的个数,也称图G的阶,E={(u, v)|u∈V, v∈V},用|E|表示图G中边的条数。注意:线性表可以是空表,树可以是空树,但图不可以是空图。图中不能一个顶点也没有,图的顶点集V一定非空,但边集E可以为空,此时图中只有顶点而没有边。有向图若E是有向边(也称弧)的有限集合时,则图G为有向图。弧是顶原创 2021-05-11 17:07:03 · 652 阅读 · 0 评论 -
哈夫曼树
哈夫曼树的定义在许多实际应用中,树中结点常常被赋予一个表示某种意义的数值,称为该结点的权。从树根结点到任意结点的路径长度(经过的边数)与该结点上权值的乘积,称为该结点的带权路径长度。树中所有叶结点的带权路径长度之和称为该树的带权路径长度,记为:WPL = ∑wiliwi是第 i 个叶结点所带的权值,li 是该叶结点到根结点的路径长度。在含有 n 个带权叶子结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称为最优二叉树。哈夫曼树的构造给定n个权值分别为w1,w2,…,wn的结原创 2021-05-11 11:04:24 · 1111 阅读 · 0 评论 -
平衡二叉树
平衡二叉树的定义为了避免树的高度增长过快,降低二叉排序树的性能,我们规定在插入和删除二叉树结点时,要保证任意结点的左、右子树高度差的绝对值不超过1,将这样的二叉树称为平衡二叉树,简称平衡树(AVL)。定义结点左子树与右子树的高度差为该结点的平衡因子,则平衡二叉树结点的平衡因子的值只可能是-1、0或1。因此,平衡二叉树可定义为或者一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度差的绝对值不超过1。平衡二叉树的插入二叉排序树保证平衡的基本思想:每当在二叉排序原创 2021-05-08 11:00:02 · 970 阅读 · 0 评论 -
二叉排序树
二叉排序树的定义二叉排序树(BST),也称二叉查找树。二叉排序树或者是一棵空树,或者是一棵具有下列特性的非空二叉树:1)若左子树非空,则左子树上所有结点关键字值均小于根结点的关键字值。2)若右子树非空,则右子树上所有结点关键字均大于根结点的关键字值。3)左、右子树本身也分别是一棵二叉排序树。由此定义可知。二叉排序树是一个递归的数据结构,可以方便地使用递归算法对二叉树排序树进行各种运算。根据二叉排序树的定义。可知左子树结点值 < 根结点值 < 右子树结点值,所以对二叉排序树进行中序遍历原创 2021-05-06 13:52:55 · 723 阅读 · 0 评论 -
树和森林的遍历
树的遍历操作:某种方式访问树中的每个结点,且仅访问一次。先根遍历。若树非空,则先访问根结点,再按从左到右的顺序遍历根结点的每棵子树。其访问顺序与这棵树相应二叉树的先序遍历顺序相同。后根遍历。若树非空,则按从左到右的顺序遍历根结点的每棵子树,之后再访问根结点。其访问顺序与这棵树相应二叉树的中序遍历顺序相同层次遍历。与二叉树的层次遍历思想基本相同,即按层次依次访问各结点。先序遍历森林。若森林为非空,则按如下规则进行遍历● 访问森林中第一棵树的根结点● 先序遍历第一棵树中根结点的子树森林● 先序遍历原创 2021-04-26 14:05:27 · 206 阅读 · 0 评论