还剩29页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
数据结构学问点概括第一章概论数据就是指能够被计算机识别、存储和加工处理的信息的载体数据元素是数据的基本单位,可以由若干个数据项组成数据项是具有独立含义的最小标识单位数据结构的定义•逻辑结构从逻辑结构上描述数据,独立于计算机•线性结构一对一关系•线性结构多对多关系存储结构是逻辑结构用计算机语言的实现-依次存储结构如数组链式存储结构如链表索引存储结构•稠密索引每个结点都有索引项稀疏索引每组结点都有索引项散列存储结构如散列表•数据运算•对数据的操作定义在逻辑结构上,每种逻辑结构都有一个运算集合•常用的有检索、插入、删除、更新、排序数据类型是一个值的集合以与在这些值上定义的一组操作的总称•结构类型由用户借助于描述机制定义,是导出类型抽象数据类型ADT•是抽象数据的组织和与之的操作相当于在概念层上描述问题•优点是将数据和操作封装在一起实现了信息隐藏程序设计的实质是对实际问题选择一种好的数据结构,设计一个好的算法算法取决于数据结构算法是一个良定义的计算过程,以一个或多个值输入,并以一个或多个值输出评价算法的好坏的因素-算法是正确的;•执行算法的时间;•执行算法的存储空间(主要是协助存储空间);遍历一样树的带权路径长度是树中全部叶结点的带权路径长度之和树的带权路径长度最小的二叉树就称为最优二叉树即哈夫曼树在叶子的权值相同的二叉树中,完全二叉树的路径长度最短哈夫曼树有n个叶结点,共有2nT个结点,没有度为1的结点,这类树又称为严格二叉树变长编码技术可以使频度高的字符编码短,而频度低的字符编码长,但是变长编码可能使解码产生二义性如
00、
01、0001这三个码无法在解码时确定是哪一个,所以要求在字符编码时任一字符的编码都不是其他字符编码的前缀,这种码称为前缀码其实是非前缀码哈夫曼树的应用最广泛地是在编码技术上,它能够简洁地求出给定字符集与其概率分布的最优前缀码哈夫曼编码的构造很简洁,只要画好了哈夫曼树,按分支状况在左路径上写代码0右路径上写代码L然后从上到下到叶结点的相应路径上的代码的序列就是该结点的最优前缀码第七章图图的逻辑结构特征就是其结点顶点的前趋和后继的个数都是没有限制的,即随意两个结点之间之间都可能相关图GraphG=VEV是顶点的有穷非空集合,E是顶点偶对的有穷集有向图Digraph每条边有方向;无向图Undigraph每条边没有方向有向完全图具有n*n-1条边的有向图;无向完全图具有n*nT/2条边的无向图;有根图有一个顶点有路径到达其它顶点的有向图;简洁路径是经过顶点不同的路径;简洁回路是起先和终端重的简洁路径;网络是带权的图图的存储结构:邻接矩阵表示法用一个n阶方阵来表示图的结构是唯一的,适合稠密图无向图邻接矩阵是对称的有向图行是出度,列是入度建立邻接矩阵算法的时间是n+rf2+e其时间困难度为0rT2邻接表表示法用顶点表和邻接表构成不是唯一的,适合稀疏图顶点表结构vertex|firstedge指针域存放邻接表头指针邻接表用头指针确定•无向图称边表;有向图又分出边表和逆邻接表;邻接表结点结构为adjvex|next时间困难度为0n+eo空间困难度为0n+eoo图的遍历•深度优先遍历借助于邻接矩阵的列运用栈保存已访问结点•广度优先遍历借助于邻接矩阵的行运用队列保存已访问结点生成树的定义若从图的某个顶点动身,可以系统地访问到图中全部顶点,则遍历时经过的边和图的全部顶点构成的子图称作该图的生成树最小生成树图的生成树不唯一,从不同的顶点动身可得到不同的生成树,把权值最小的生成树称为最小生成树MSTo构造最小生成树的算法-Prim算法的时间困难度为0r2与边数无关适于稠密图•Kruskal算法的时间困难度为0Ige主要取决于边数,较适合于稀疏图最短路径的算法•Dijkstra算法,时间困难度为0rT2•类似于prim算法拓扑排序是将有向无环图G中全部顶点排成一个线性序列,若uvEEG则在线性序列u在v之前,这种线性序列称为拓扑序列拓扑排序也有两种方法•无前趋的顶点优先,每次输出一个无前趋的结点并删去此结点与其出边,最终得到的序列即拓扑序列•无后继的结点优先每次输出一个无后继的结点并删去此结点与其入边,最终得到的序列是逆拓扑序列第八章排序记录中可用某一项来标识一个记录,则称为关键字项,该数据项的值称为关键字排序是使文件中的记录按关键字递增(或递减)次序排列起来.基本操作比较关键字大小;变更指向记录的指针或移动记录存储结构依次结构、链表结构、索引结构经过排序后这些具有相同关键字的记录之间的相对次序保持不变,则称这种排序方法是稳定的,否则排序算法是不稳定的排序过程中不涉与数据的内、外存交换则称之为“内部排序”(内排序),反之,若存在数据的内外存交换,则称之为外排序内部排序方法可分五类插入排序、选择排序、交换排序、归并排序和安排排序评价排序算法好坏的标准主要有两条执行时间和所需的协助空间,另外算法的困难程序也是要考虑的一个因素插入排序-干脆插入排序-逐个向前插入到合适位置哨兵(监视哨)有两个作用•作为临变量存放R[i]是在查找循环中用来监视下标变量j是否越界干脆插入排序是就地的稳定排序时间困难度为0(rT2)比较次数为(n+2)(n-1)/2;移动次数为(n+4)(n-1)/2;•希尔排序•等间隔的数据比较并按要求依次排列,最终间隔为
1.希尔排序是就地的不稳定排序时间困难度为0(n
1.25)比较次数为(n
1.25);移动次数为(
1.6rf
1.25);交换排序,冒泡排序•自下向上确定最轻的一个•自上向下确定最重的一个•自下向上确定最轻的一个,后自上向下确定最重的一个冒泡排序是就地的稳定排序时间困难度为0Z2比较次数为nn-1/2;移动次数为3nn-1/2;快速排序•以第一个元素为参考基准,设定、动两个指针,发生交换后指针交换位置直到指针重合重复直到排序完成快速排序是非就地的不稳定排序时间困难度为0nlog2n比较次数为nn-1/2;选择排序-干脆选择排序・选择最小的放在比较区前干脆选择排序就地的不稳定排序时间困难度为0Z2比较次数为nn-1/2;堆排序•建堆按层次将数据填入完全二叉树,从intn/2处向前逐个调整位置然后将树根与最终一个叶子交换值并断开与树的连接并重建堆,直到全断开堆排序是就地不稳定的排序,时间困难度为0nlog2n不相宜于记录数较少的文件归并排序•先两个一组排序,形成n+1/2组,再将两组并一组,直到剩下一组为止归并排序是非就地稳定排序,时间困难度是0nlog2n安排排序•箱排序•按关键字的取值范围确定箱子数,按关键字投入箱子,链接全部非空箱箱排序的平均时间困难度是线性的0no•基数排序・从低位到高位依次对关键字进行箱排序•基数排序是非就稳定的排序,时间困难度是d*n+d*rd各种排序方法的比较和选择•待排序的记录数目n;n较大的要用时间困难度为0nlog2n的排序方法;记录的大小规模;记录大最好用链表作为存储结构,而快速排序和堆排序在链表上难于实现;关键字的结构与其初始状态;-对稳定性的要求;语言工具的条件;•存储结构;•时间和协助空间困难度第九章查找查找的同时对表做修改操作如插入或删除则相应的表称之为动态查找表,否则称之为静态查找表衡量查找算法效率优劣的标准是在查找过程中对关键字须要执行的平均比较次数即平均查找长度ASDo线性表查找的方法•依次查找逐个查找,ASL=n+1/2;二分查找取中点intn/2比较,若小就比左区间,大就比右区间用二叉判定树表示ASL=Z每层结点数*层数/N.分块查找要求“分块有序”,将表分成若干块内部不肯定有序,并抽取各块中的最大关键字与其位置建立有序索引表二叉排序树BST定义是二叉排序树是空树或者满意如下性质的二叉树•若它的左子树非空,则左子树上全部结点的值均小于根结点的值;若它的右子树非空,则右子树上全部结点的值均大于根结点的值;•左、右子树本身又是一棵二叉排序树二叉排序树的插入、建立、删除的算法平均时间性能是0nlog2n二叉排序树的删除操作可分三种状况进行处理・*P是叶子,则干脆删除*P即将*P的双亲*parent中指向*P的指针域置空即可・*p只有一个孩子*child此时只需将*child和*p的双亲干脆连接就可删去*p.・*P有两个孩子,则先将*P结点的中序后继结点的数据到*P,删除中序后继结点关于B-树多路平衡查找树它适合在磁盘等干脆存取设备上组织动态的查找表,是一种外查找算法建立的方式是从下向上拱起散列技术将结点按其关键字的散列地址存储到散列表的过程称为散列散列函数的选择有两条标准简洁和匀称常见的散列函数构的造方法平方取中法hash=intx2%100除余法表长为mhash=x%m•相乘取整法:hash=intm*x*A-intx*A;A=
0.618•随机数法:hash=randomx处理冲突的方法•开放定址法•一般形式为hi=hkey+di开放定址法要求散列表的装填因子aWl.开放定址法类型•线性探查法address=hashx+i二次探查法address二hashx+1/2%m;双重散列法address二hashx+i*hashy%m;•拉链法-是将全部关键字为同义词的结点链接在同一个单链表中•拉链法的优点•拉链法处理冲突简洁,且无积累现象;链表上的结点空间是动态申请的适于无法确定表长的状况;•拉链法中a可以大于1结点较大时其指针域可忽视,因此节约空间;•拉链法构造的散列表删除结点易实现•拉链法也有缺点当结点规模较小时,用拉链法中的指针域也要占用额外空间,还是开放定址法省空间第十章排序
10.1排序的基本概念插入排序选择排序交换排序本章主要学问点排序的基本概念和衡量排序算法优劣的标准,其中衡量标准有算法的时间困难度、空间困难度和稳定性干脆插入排序,希尔排序干脆选择排序,堆排序冒泡排序,快速排序1排序的基本概念.排序是对数据元素序列建立某种有序排列的过程.排序的目的便于查找.关键字是要排序的数据元素集合中的一个域,排序是以关键字为基准进行的关键字分主关键字和次关键字两种对要排序的数据元素集合来说,假如关键字满意数据元素值不同时该关键字的值也肯定不同,这样的关键字称为主关键字不满意主关键字定义的关键字称为次关键字.排序的种类分为内部排序和外部排序两大类若待排序记录都在内存中,称为内部排序;若待排序记录一部分在内存,一部分在外存则称为外部排序注外部排序时,要将数据分批调入内存来排序,中间结果还要与时放入外存,明显外部排序要困难得多.排序算法好坏的衡量标准⑴时间困难度一一它主要是分析记录关键字的比较次数和记录的移动次数⑵空间困难度一一算法中运用的内存协助空间的多少⑶稳定性一一若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的
10.2插入排序插入排序的基本思想是每步将一个待排序的对象,按其关键字大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止简言之,边插入边排序,保证子序列中随时都是排好序的常用的插入排序有干脆插入排序和希尔排序两种
10.
2.1干脆插入排序>其基本思想是依次地把待排序的数据元素按其关键字值的大小插入到已排序数据元素子集合的适当位置例1关键字序列T=136331927511请写出干脆插入排序的中间过程序列初始关键字序列【13】,6331927511注方括号[]中为已排序记录的关键字,下划横线的关键字表示它对应的记录后移一个位置.干脆插入排序算法publicstaticvoidinsertSortint[]a{intijtemp;intn二a.Length;fori=0;in-1;i++{temp=a[i+1];♦•J=1;whilej-1tempa[j]{a[j+1]=a[j];j-;a[j+1]=temp;初始关键字序列【13】,6331927511第一次排序
[613]331927511其次次排序
[3613]
319275113、干脆插入排序算法分析⑴时间效率当数据有序时,执行效率最好,此时的时间困难度为0n;当数据基本反序时执行效率最差,此时的时间困难度为0n2所以当数据越接近有序,干脆插入排序算法的性能越好⑵空间效率仅占用1个缓冲单元一一01⑶算法的稳定性稳定希尔shell排序又称缩小增量排序
1、基本思想把整个待排序的数据元素分成若干个小组,对同一小组内的数据元素用干脆插入法排序;小组的个数逐次缩小,当完成了全部数据元素都在一个组内的排序后排序过程结束
2、技巧小组的构成不是简洁地“逐段分割”,而是将相隔某个增量d的记录组成一个小组让增量d逐趟缩短例如依次取531直到d=l为止
3、优点让关键字值小的元素能很快前移,且序列若基本有序时,再用干脆插入排序处理,时间效率会高许多例2设待排序的序列中有12个记录它们的关键字序列T=653425871238564614779223请写出希尔排序的详细实现过程publicstaticvoidshellSortint[]aint[]dintnumOfD{intijkmspan;inttemp;intn=a.Length;form=0;mnumOfD;m++{〃共numOfD次循环span=d[m];〃取本次的增量值fork=0;kspan;k++{〃共span个小组fori=k;in-span;i二i+span{temp=a[i+span];••J:1;whilej-1tempa[j]{a[j+span]=a[j];j=j-span;}a[j+span]二temp;算法分析起先时d的值较大,子序列中的对象较少,排序速度较快;随着排序进展,d值渐渐变小,子序列中对象个数渐渐变多,由于前面工作的基础,大多数记录已基本有序,所以排序速度仍旧很快时间效率:0nlog2n2空间效率01——因为仅占用1个缓冲单元算法的稳定性不稳定练习.欲将序列QHCYPAMSRDFX中的关键码按字母升序重排,则初始d为4的希尔排序一趟的结果是?答原始序列QHCYPAMSRDFXshell一趟后PACSQDFXRHMY.以关键字序列256301751129937863742694076438为例,写出执行希尔排序取d=531算法的各趟排序结束时,关键字序列的状态解原始序列256301751129937863742694076438希尔排序第一趟d=5256301694076438863742751129937•算法易于理解、编码、调试时间困难度是某个算法的时间耗费,它是该算法所求解问题规模n的函数渐近时间困难度是指当问题规模趋向无穷大时,该算法时间困难度的数量级评价一个算法的时间性能时,主要标准就是算法的渐近时间困难度算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关时间困难度按数量级递增排列依次为常数阶
01、对数阶0log2n>线性阶0n、线性对数阶nlog2n.平方阶0rT
2、立方阶0rT
3、……k次方阶0rTk、指数阶02%空间困难度是某个算法的空间耗费,它是该算法所求解问题规模n的函数算法的时间困难度和空间困难度合称算法困难度其次章线性表线性表是由nNO个数据元素组成的有限序列n=0是空表;非空表,只能有一个起先结点,有且只能有一个终端结点线性表上定义的基本运算构造空表InitlistL求表长ListlengthL取结点GetNodeLi•查找LocateNodeLx•插入InsertListLxi删除:DeleteLi依次表是按线性表的逻辑结构次序依次存放在一组地址连续的存储单元中0在存储单元中的各元素的物理位置和逻辑结构中各结点相邻关系是一样的地址计算LOCai=L0Ca1+i-1*d;首地址为1在依次表中实现的基本运算:其次趟d=3076301129256438694742751863937第三趟d=l0761292563014386947427518639373选择排序选择排序的基本思想是每次从待排序的数据元素集合中选取关键字最小或最大的数据元素放到数据元素集合的最前或最终,数据元素集合不断缩小,当数据元素集合为空时选择排序结束常用的选择排序算法1干脆选择排序2堆排序
3.1干脆选择排序
1、其基本思想每经过一趟比较就找出一个最小值,与待排序列最前面的位置互换即可即从待排序的数据元素集合中选取关键字最小的数据元素并将它与原始数据元素集合中的第一个数据元素交换位置;然后从不包括第一个位置的数据元素集合中选取关键字最小的数据元素并将它与原始数据集合中的其次个数据元素交换位置;如此重复,直到数据元素集合中只剩一个数据元素为止
2、优缺点优点实现简洁缺点每趟只能确定一个元素,表长为n时须要nT趟例3关键字序列T=21254925*1608请给出干脆选择排序的详细实现过程原始序列21254925*1608publicstaticvoidselectSortint[]a{intijsmall;inttemp;intn=a.Length;fori=0;in-1;i++{small二i;〃设第i个数据元素最小forj=i+1;jn;j++〃找寻最小的数据元素ifa[j]a[small]small二j;〃记住最小元素的下标ifsmall!=i{〃当最小元素的下标不为i时交换位置temp=a[i];a[i]=a[small];a[small]二temp;
3、算法分析时间效率0n2——虽移动次数较少,但比较次数仍多空间效率01——没有附加单元仅用到1个temp算法的稳定性不稳定
4、稳定的干脆选择排序算法例关键字序列T二21254925*1608请给出稳定的干脆选择排序的详细实现过程原始序列:21254925*1608第1趟0821254925*16第2趟081621254925*第4趟081621254925*第5趟0816212525*49publicstaticvoidselectSort2int[]a{intijsmall;inttemp;intn=a.Length;fori=0;in-l;i++{small=i;forj=i+1;jn;j++{〃找寻最小的数据元素ifa[j]a[small]small二j;〃记住最小元素的下标}ifsmall!=i{temp=a[small];forj二small;ji;j-〃把该区段尚未排序元素依次后移a[j]:a[j-l]a[i]=temp;〃插入找出的最小元素堆排序.什么是堆?
2.怎样建堆?
3.怎样堆排序?堆的定义设有n个数据元素的序列k0kl…,kn-1当且仅当满意下述关系之一时,称之为堆说明假如让满意以上条件的元素序列(kOkl…,kn-1)顺次排成一棵完全二叉树则此树的特点是树中全部结点的值均大于(或小于)其左右孩子,此树的根结点(即堆顶)必最大(或最小例4有序列T序082549465867和序列T序91857666586755推断它们是否“堆”?.怎样建堆?步骤从第一个非终端结点起先往前逐步调整,让每个双亲大于或小于子女,直到根结点为止终端结点即叶子没有任何子女,无需单独调整例关键字序列T二21254925*1608请建最大堆解为便于理解,先将原始序列画成完全二叉树的形式这样可以很清楚地从nTT/2起先调整publicstaticvoidcreateHeapint[]aintninth{intijflag;inttemp;i=h;j=2*i+1;〃j为i结点的左孩子结点的下标temp=a[i];flag=0;whilejnflag!=1{〃找寻左右孩子结点中的较大者j为其下标ifjn-1a[j]a[j+1]j++;iftemp=a[j]//a[i]=a[j]flag=1;〃标记结束筛选条件else{〃否则把a[j]上移a[i]=a[j];••1=j;a[i]=temp;}利用上述createHeapanh函数,初始化创建最大堆的过程就是从第一个非叶子结点a[i]起先到根结点a
[0]为止,循环调用createHeapanh的过程初始化创建最大堆算法如下publicstaticvoidinitCreateHeapint[]a{intn=a.Length;forinti=n-l-l/2;i=0;i一createHeapani;}
3.怎样进行整个序列的堆排序?*基于初始堆进行堆排序的算法步骤堆的第一个对象a
[0]具有最大的关键码,将a
[0]与对调,把具有最大关键码的对象交换到最终;再对前面的n-1个对象,运用堆的调整算法,重新建立堆调整根结点使之满意最大堆的定义结果具有次最大关键码的对象又上浮到堆顶,即a
[0]位置;再对调a
[0]和a[n-2]然后对前n-2个对象重新调整,…如此反复,最终得到全部排序好的对象序列例5对刚才建好的最大堆进行排序publicstaticvoidheapSortint[]a{inttemp;intn二a.Length;initCreateHeapa;〃初始化创建最大堆forinti=n-1;i0;i--{〃当前最大堆个数每次递减1//把堆顶a
[0]元素和当前最大堆的最终一个元素交换练习2有一组数据{159782017*4}建成的最小堆为该序列作非递减排列时的排序过程排序好的序列为
618717027546250351265389710.4交换排序交换排序的基本思想是利用交换数据元素的位置进行排序的方法交换排序的主要算法有1冒泡排序2快速排序
1、基本思路每趟不断将记录两两比较,并按“前小后大”或“前大后小”规则交换
2、优点每趟结束时,不仅能挤出一个最大值到最终面位置,还能同时部分理顺其他元素;一旦下趟没有交换发生,还可以提前结束排序25*1608请按从小到大的依次,写出冒泡排序的详细实现过程
3、冒泡排序算法fori=1;inflag==1;i++{flag=0;forj=0;jn-i;j++{ifa[j]a[j+l]{flag=1;temp=a[j];a[j]=a[j+l];a[j+l]=temp;
4、冒泡排序的算法分析时间效率0m2—因为要考虑最坏状况数据元素全部逆序,当然最好状况是数据元素已全部排好序,此时循环n-l次,时间困难度为0n空间效率01一只在交换时用到一个缓冲单元稳定性稳定一25和25*在排序前后的次序未变更练习关键字序列T=31159251628请按从小到大的依次,写出冒泡排序的详细实现过程初态31159251628第1趟15925162831第2趟91516252831第3趟
915162528311、基本思想设数组a中存放了n个数据元素,low为数组的低端下标,high为数组的高端下标,从数组a中任取一个元素通常取a[low]做为标准元素,以该标准元素调整数组a中其他各个元素的位置,使排在标准元素前面的元素均小于标准元素,排在标准元素后面的均大于或等于标准元素这样一次排序过程结束后,一方面将标准元素放在了将来排好序的数组中该标准元素应位于的位置上,另一方面将数组中的元素以标准元素为中心分成了两个子数组,位于标准元素左边子数组中的元素均小于标准元素,位于标准元素右边子数组中的元素均大于等于或标准元素对这两个子数组中的元素分别再进行方法类同的递归快速排序算法的递归出口条件是lowNhigh例、关键字序列T=6055483710908436请按从小到大的依次,写出快速排序的详细实现过程快速排序算法各次快速排序过程
3、快速排序算法publicstaticvoidquicksortint[]aintlowinthigh{intij;inttemp;i=low;j=high;temp=a[low];〃取第一个元素为标准数据元素whileij{〃在数组的右端扫描whileijtemp=a[j]j-一;ifij{a[i]=a[j];i++;〃在数组的左端扫描whileija[i]tempi++;ifij{a[j]=a[i];j—;}}a[i]=temp;iflowiquicksortalowi~l;〃对左端子集合递归ifihighquicksortaj+1high;〃对右端子集合递归
4、快速排序算法分析时间效率一般状况下时间困难度为0nlog2n最坏状况是数据元素已全部正序或反序有序此时每次标准元素都把当前数组分成一个大小比当前数组小1的子数组,此时时间困难度为0n2空间效率0(log2n)—因为递归要用栈稳定性不稳定一因为有跳动式交换练习已知序列{5038751261908170897275653462),给出采纳快速排序对该序列作非递减排序时每趟的结果
6.用干脆插入排序对下面4个序列进行递增排序,元素比较次数最少的是(C)
8.对关键字(28163212602572}序列进行快速排序,第一趟从小到大一次划分结果为BA.25121626603272B.51621228603272•插入平均移动结点次数为n/2;平均时间困难度均为0n•删除平均移动结点次数为n-l/2;平均时间困难度均为0no线性表的链式存储结构中结点的逻辑次序和物理次序不肯定相同,为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还存储了其后继结点的地址信息即指针或链这两部分信息组成链表中的结点结构一个单链表由头指针的名字来命名单链表运算・建立单链表•头插法s-〉next二head;head=s;生成的依次与输入依次相反平均时间困难度均为0no•尾插法head二rear二null;ifhead=nullhead二s;elser-next=s;r=s;平均时间困难度均为0n加头结点的算法对起先结点的操作无需特别处理,统一了空表和非空表查找•按序号与查找位置有关,平均时间困难度均为0n0按值与输入实例有关,平均时间困难度均为0n插入运算:p=GetNodeLi-1;s-next=p-next;p-next=s;平均时间困难度均为0n•删除运算:p=GetNodeLi-1;r=p-除ext;p-next=r-next;freer;平均时间困难度均为0n单循环链表是一种首尾相接的单链表,终端结点的指针域指向起先结点或头结点链表终止条件是以指针等于头指针或尾指针采纳单循环链表在好用中多采纳尾指针表示单循环链表优点是查找头指针和尾指针的时间都是01不用遍历整个链表双链表就是双向链表,就是在单链表的每个结点里再增加一个指向其干脆前趋的指针域prior形成两条不同方向的链由头指针head惟一确定21612528603272D.
516212283260729.若用冒泡排序对关键字序列{18161412108}进行从小到大的排序,所需进行的关键字比较总次数是BA.10B.15C.2134一组记录的关键字为{458055404285则利用堆排序的方法建立的初始堆为BA.{858045404255}B.{858055404245}C.{858055454240}D.{855580424540}第十章文件文件是性质相同的记录的集合记录是文件中存取的基本单位,数据项是文件可运用的最小单位,数据项有时称字段或者属性文件-逻辑结构是一种线性结构操作有检索和维护并有实时和批量处理两种处理方式文件•存储结构是指文件在外存上的组织方式基本的组织方式有依次组织、索引组织、散列组织和链组织常用的文件组织方式依次文件、索引文件、散列文件和多关键字文件评价一个文件组织的效率,是执行文件操作所花费的时间和文件组织所需的存储空间检索功能的多寡和速度的快慢,是衡量文件操作质量的重要标记依次文件是指按记录进入文件的先后依次存放、其逻辑依次和物理依次一样的文件主关键字有序称依次有序文件,否则称依次无序文件一切存储在依次存储器(如磁带)上的文件都只能依次文件,只能按依次查找法存取依次文件的插入、删除和修改只能通过复制整个文件实现索引文件的组织方式通常是在主文件之外建立一张索引表指明逻辑记录和物理记录之间一一对应的关系,它和主文件一起构成索引文件索引非依次文件中的索引表为稠密索引索引依次文件中的索引表为稀疏索引若记录很大使得索引表也很大时,可对索引表再建立索引,称为查找表是一种静态索引索引依次文件常用的有两种ISAM索引依次存取方法是专为磁盘存取文件设计的,采纳静态索引结构•VSAM虚拟存储存取方法采纳B+树作为动态索引结构,由索引集、依次集、数据集组成散列文件是利用散列存储方式组织的文件,亦称为干脆存取文件散列文件优点是文件随机存放,记录不须要排序;插入删除便利;存取速度快;不须要索引区节约存储空间•缺点是不能进行依次存取,只能按关键字随机存取,且询问方式限地简洁询问,须要重新组织文件多重表文件对须要查询的次关键字建立相应的索引,对相同次关键字的记录建一个链表并将链表头指针、长度、次关键字作为索引表的索引项倒排表次关键字索引表称倒排表,主文件和倒排表构成倒排文件双链表也可以头尾相链接构成双向循环链表双链表上的插入和删除时间困难度均为0lo依次表和链表的比较-基于空间•依次表的存储空间是静态安排,存储密度为1;适于线性表事先确定其大小时采纳•链表的存储空间是动态安排,存储密度<1;适于线性表长度变更大时采纳基于时间依次表是随机存储结构,当线性表的操作主要是查找时,宜采纳以插入和删除操作为主的线性表宜采纳链表做存储结构•若插入和删除主要发生在表的首尾两端,则宜采纳尾指针表示的单循环链表第三章栈和队列栈Stack是仅限制在表的一端进行插入和删除运算的线性表,称插入、删除这一端为栈顶,另一端称为栈底表中无元素时为空栈栈的修改是按后进先出的原则进行的,我们又称栈为LIFO表LastInFirstOut通常栈有依次栈和链栈两种存储结构栈的基本运算有六种-构造空栈InitStackS判栈空StackEmptyS•判栈满StackFullS进栈PushSx退栈PopS取栈顶元素StackTopS在依次栈中有“上溢”和“下溢”的现象•“上溢”是栈顶指针指出栈的外面是出错状O・“下溢”可以表示栈为空栈,因此用来作为限制转移的条件依次栈中的基本操作有六种•构造空栈•判栈空•判栈满•进栈•退栈•取栈顶元素链栈则没有上溢的限制,因此进栈不要判栈满链栈不须要在头部附加头结点,只要有链表的头指针就可以了链栈中的基本操作有五种•构造空栈•判栈空•进栈•退栈•取栈顶元素队列Queue是一种运算受限的线性表,插入在表的一端进行,而删除在表的另一端进行,允许删除的一端称为队头front允许插入的一端称为队尾rear队列的操作原则是先进先出的,又称作FIFO表FirstInFirstOut.队列也有依次存储和链式存储两种存储结构队列的基本运算有六种•置空队InitQueueQ判队空QueueEmptyQ判队满QueueFullQ•入队EnQueueQx•出队DeQueueQ取队头元素QueueFrontQ依次队列的“假上溢”现象由于头尾指针不断前移,超出向量空间这时整个向量空间与队列是空的却产生了“上溢”现象为了克服“假上溢”现象引入循环向量的概念,是把向量空间形成一个头尾相接的环形,这时队列称循环队列判定循环队列是空还是满,方法有三种•一种是另设一个布尔变量来推断;•其次种是少用一个元素空间,入队时先测试rear+1%m=front满空;第三种就是用一个计数器记录队列中的元素的总数队列的链式存储结构称为链队列,一个链队列就是一个操作受限的单链表为了便于在表尾进行插入入队的操作,在表尾增加一个尾指针,一个链队列就由一个头指针和一个尾指针唯一地确定链队列不存在队满和上溢的问题在链队列的出队算法中,要留意当原队中只有一个结点时,出队后要同进修改头尾指针并使队列变空第四章串串是零个或多个字符组成的有限序列空串是指长度为零的串,也就是串中不包含任何字符结点空白串指串中包含一个或多个空格字符的串在一个串中随意个连续字符组成的子序列称为该串的子串,包含子串的串就称为主串子串在主串中的序号就是指子串在主串中首次出现的位置空串是随意串的子串,随意串是自身的子串串分为两种-串常量在程序中只能引用不能变更;串变量的值可以变更串的基本运算有♦求串长strlencharts串复制strcpychar*tochar*from串联接strcatchar*tochar*from•串比较charcmpcharts1char*s2字符定位strchrchartschare串是特别的线性表结点是字符,所以串的存储结构与线性表的存储结构类似串的依次存储结构简称为依次串依次串又可按存储安排的不同分为・静态存储安排干脆用定长的字符数组来定义优点是涉与串长的操作速度快,但不适合插入、链接操作・动态存储安排是在定义串时不安排存储空间,须要运用时按所需串的长度安排存储单元串的链式存储就是用单链表的方式存储串值,串的这种链式存储结构简称为链串链串与单链表的差异只是它的结点数据域为单个字符为了解决“存储密度”低的状况,可以让一个结点存储多个字符,即结点的大小依次串上子串定位的运算又称串的“模式匹配”或“串匹配”,是在主串中查找出子串出现的位置在串匹配中,将主串称为目标串,子串称为模式串这是比较简洁理解的串匹配问题就是找出给定模式串P在给定目标串T中首次出现的有效位移或者是全部有效位移最坏的状况下时间困难度是0n-m+1m假如m与n同阶的话则它是0iT2链串上的子串定位运算位移是结点地址而不是整数第五章多维数组数组一般用依次存储的方式表示存储的方式有-行优先依次,也就是把数组逐行依次排列PASCAL.C•列优先依次,就是把数组逐列依次排列FORTRAN地址的计算方法•按行优先依次排列的数组LOCaij;LOCa11+i-1*n+j-1*d.•按列优先依次排列的数组LOCaij=LOCa11+j-1*n+i-1*d.矩阵的压缩存储为多个相同的非零元素安排一个存储空间;对零元素不安排空间特别矩阵的概念所谓特别矩阵是指非零元素或零元素分布有肯定规律的矩阵稀疏矩阵的概念一个矩阵中若其非零元素的个数远远小于零元素的个数,则该矩阵称为稀疏矩阵特别矩阵的类型•对称矩阵满意aij=ajio元素总数nn+1/
2.I二maxijJ=minijLOCaij;LOCsa
[0]+I*1+1/2+J*d.•三角矩阵•上三角阵k=i*2n-i+l/2+j-iLOCaij=LOCsa
[0]+k*d.・下三角阵k=i*i+1/2+jLOCaij=LOCsa
[0]+k*d.对角矩阵k=2i+jLOCaij=LOCsa
[0]+k*d.稀疏矩阵的压缩存储方式用三元组表把非零元素的值和它所在的行号列号做为一个结点存放在一起,用这些结点组成的一个线性表来表示但这种压缩存储方式将失去随机存储功能加入行表记录每行的非零元素在三元组表中的起始位置,即带行表的二元组表第六章树树是n个结点的有限集合,非空时必需满意只有一个称为根的结点;其余结点形成m个不相交的子集,并称根的子树根是起先结点;结点的子树数称度;度为0的结点称叶子(终端结点);度不为0的结点称分支结点(非终端结点);除根外的分支结点称内部结点;有序树是子树有左,右之分的树;无序树是子树没有左,右之分的树;森林是川个互不相交的树的集合;树的四种不同表示方法•树形表示法;•嵌套集合表示法;•凹入表示法•广义表表示法二叉树的定义是n20个结点的有限集,它是空集(n=0)或由一个根结点与两棵互不相交的分别称作这个根的左子树和右子树的二叉树组成二叉树不是树的特别情形,与度数为2的有序树不同二叉树的4个重要性质•二叉树上第i层上的结点数目最多为21(i-l)深度为k的二叉树至多有(2飞)-1个结点(k2l);在随意一棵二叉树中,若终端结点的个数为nO度为2的结点数为n2则nO=n2+l;具有n个结点的完全二叉树的深度为int(log2n)+
1.满二叉树是一棵深度为k结点数为
(22)-1的二叉树;完全二叉树是满二叉树在最下层自右向左去处部分结点;二叉树的依次存储结构就是把二叉树的全部结点依据层次依次存储到连续的存储单元中(存储前先将其画成完全二叉树)树的存储结构多用的是链式存储BinTNode的结构为Ichild|data|rchild把全部BinTNode类型的结点,加上一个指向根结点的BinTree型头指针就构成了二叉树的链式存储结构,称为二叉链表它就是由根指针root唯一确定的共有2n个指针域,n+1个空指针依据访问结点的次序不同可得三种遍历先序遍历(前序遍历或先根遍历),中序遍历(或中根遍历)、后序遍历(或后根遍历)时间困难度为0(n)o利用二叉链表中的n+1个空指针域来存放指向某种遍历次序下的前趋结点和后继结点的指针,这些附加的指针就称为“线索”,加上线索的二叉链表就称为线索链表线索使得查找中序前趋和中序后继变得简洁有效,但对于查找指定结点的前序前趋和后序后继并没有什么作用树和森林与二叉树的转换是唯一对应的转换方法•树变二叉树兄弟相连,保留长子的连线•二叉树变树结点的右孩子与其双亲连•森林变二叉树树变二叉树,各个树的根相连树的存储结构•有双亲链表表示法结点data|parent对于求指定结点的双亲或祖先非常便利,但不适于求指定结点的孩子与后代孩子链表表示法为树中每个结点data|next设置一^1V孩子链表firstchild并将datafirstchild存放在一个向量中双亲孩子链表表示法将双亲链表和孩子链表结合孩子兄弟链表表示法结点结构leftmostchild|data|rightsibing附加两个分别指向该结点的最左孩子和右邻兄弟的指针域树的前序遍历与相对应的二叉树的前序遍历一样;树的后序遍历与相对应的二叉树的中序。
个人认证
优秀文档
获得点赞 0