公共基础教材剖析.docx
《公共基础教材剖析.docx》由会员分享,可在线阅读,更多相关《公共基础教材剖析.docx(49页珍藏版)》请在冰豆网上搜索。
公共基础教材剖析
计算机等级考试
二级科目公共基础
内部资料,版权所有,翻版必究
第一章算法与数据结构
1.1算法
1.算法的概念
算法,是指解题方案的准确而完整的描述。
对于一个问题,如果可以通过一个计算机程序,能够在有限的存储空间内运行有限的时间而得到正确的结果,则这个问题是算法可解的。
但是算法不等于程序,也不等于计算方法。
程序可以作为算法的一种描述,通常程序的编制不可能优于算法的设计。
2.算法的基本特征
(1)可行性,算法执行过程中会受到计算工具的限制,使执行结果产生偏差,所以,要考虑算法的可行性。
(2)确定性,算法的每一个步骤都必须有明确的含义,不允许有二义性。
(3)有穷性,算法能在有限的时间内,执行有限的步骤之后终止。
(4)拥有足够的情报(提供数据的输入和结果输出)。
综上所述,算法是一组严谨的定义运算顺序的规则,并且每一个规则都是有效的、明确的,此算法在运行有限的次数后终止。
3.算法的两个基本要素
一个算法通常由两种基本要素组成,一是对数据对象的运算和操作,二是算法的控制结构。
每一个算法实际上是按解题的要求从环境能进行的所有的操作中选择合适的操作所组成的一组指令序列。
因此,计算机算法就是计算机能处理的操作所组成的指令序列。
基本的运算和操作:
算术运算、逻辑运算、关系运算、数据的传输(输入、输出、赋值)。
算法的各个操作之间的执行顺序,称为算法的控制结构。
一个算法的功能不仅取决于所选用的操作,而且还与操作之间的执行顺序有关。
算法的控制结构给出了算法的基本框架,它不仅决定了算法中各操作的执行顺序,而且也直接反映了算法的设计是否符合结构化原则。
描述算法的工具:
传统的流程图、N-S结构化流程图、算法描述语言。
算法的基本控制结构有:
顺序、选择、循环。
4.算法设计中几种常见的方法
列举法、归纳法、递推法、递归法、减半递推技术、回溯法。
递归法——基本思想:
在解决复杂问题的时候,为了降低问题的复杂程度(问题的规模)将问题逐层的分解,归结为最简单的问题,分解的过程没有解决问题,而只是解决了最后最简单的一步,再沿着原来的分解步骤逆回去就能解决整个问题。
递归的基础也是归纳。
递归法分为两种:
直接递归和间接递归。
例如:
函数求解整数的阶乘fun(n)=n!
If(n=1ORn=0)return1;
Elsereturnn*fun(n-1)
减半递推技术——又称为“分治法”,基本思想:
问题的规模减半,而问题的性质不变;递推是指重复减半的过程。
数组s[0]s[1]s[2]s[3]s[4]s[5]s[6]
271013162128
在以上的数组中查找变量x=28是否存在,最好的情况是从顺序表后面的元素向前查找,判断一次即能找到;最坏的情况是从顺序表前面的元素向后查找,判断n次找到或找不到;平均情况下在中间某个位置找到,根据概率统计大约进行n/2次比较(时间复杂度)。
如果先将要查找的数据与数组中间的元素s[3]进行比较,由于x>s[3],所以不再搜索s[3]左边的元素,这样可以去掉一半的元素;再将要查找的数据与剩余的一半元素的中间元素比较s[5]使用减半技术的前提:数据是有序的(升序/降序)序列。5.算法的复杂度算法的复杂度主要包括:时间复杂度和空间复杂度。(1)算法的时间复杂度,是指执行算法时所需要的计算工作量;用算法执行过程中基本运算的执行次数来度量算法的工作量。算法所执行的基本运算的次数是问题规模的函数。算法的工作量=f(n)n是问题的规模。在同一个问题规模下,算法的执行次数取决于某一次特定的输入。平均时间复杂度和最坏时间复杂度——是算法时间复杂度的两种评价标准。(2)算法的空间复杂度,是指执行算法所需要的内存空间。一个算法所需要的存储空间包括程序所占的空间、初始数据所占的空间和算法执行过程中的额外空间。如果额外的空间相对于问题的规模来说是常量,则称该算法是“原地工作”。例如:借助某个变量将数组(任意大小)的所有元素翻转。Main(){ints[10]={0,1,2,3,4,5,6,7,8,9},i,j,x;i=0,j=9;while(i{x=s[i];s[i]=s[j];s[j]=x;i++;j--;}}1.2数据结构1.数据结构的概念(1)数据集合中各数据元素之间的逻辑关系,即数据的逻辑结构。(2)在对数据进行处理时,数据元素在计算机中的存储关系,即数据的存储结构。(3)对各种数据结构进行的运算。研究数据结构的目的:提高数据处理的效率;节省计算机的存储空间。在数据处理领域中,每一个需要处理的对象都可以抽象成数据元素,数据元素一般简称元素。一般情况下,在具有相同特征的数据元素集合中,各个数据元素之间存在有某种关系,这种关系反映了该集合中的数据元素所固有的一种结构。在数据处理领域中,通常把数据元素之间的固有关系简单的称为“前后件关系”。在某个数据元素前面的元素称为“直接前驱”,后面的元素称为“直接后驱”。一个数据结构应该包含以下两方面的信息:(1)表示数据元素的信息(数据元素本身)。(2)表示数据元素之间的前后件关系,是一种逻辑关系。2.数据的逻辑结构数据的逻辑结构,是指反映数据元素之间的逻辑关系(前后件关系)的数据结构。数据的逻辑结构中根据数据元素前后件关系的复杂程序分为:线性结构与非线性结构。线性结构,有且仅有一个根结点;每一个结点最多有一个前件,也最多有一个后件,也称为线性表。在一个线性结构中插入或删除任何一个结点后还应该是线性结构。可以这样表示B=(D,R)B表示数据结构;R表示数据元素之间的前后件关系;D表示数据元素。例如:一年四季B=(D,R)D={春,夏,秋,冬}R={(春,夏),(夏,秋),(秋,冬)}3.数据的存储结构数据的逻辑结构在计算机中的存放形式称为数据的存储结构(又称为物理结构)。在数据的存储结构中不仅存放各数据元素的信息,还要存放各数据元素前后件关系的信息。在实际进行数据处理时,被处理的各个数据元素总是被存放在计算机的存储空间中,并且各个数据元素在计算机存储空间中位置关系与它们的逻辑关系不一定相同。常用的存储结构:顺序、链接和索引。数据结构中的各个数据元素在计算机存储空间中的位置关系与逻辑关系可能是不同的。1.3线性表及其存储结构LinearList线性表中的每一个数据元素可以是简单项(数组),也可以是有多个数据项组成(表的每一条记录)。线性表,是最简单也是最常用的数据结构。例如:线性表中数据元素的位置只取决于它们自己的序号,即数据元素之间的相对位置是线性的。非空线性表的特征(1)有且仅有一个根结点a1,它无前件。(2)有且仅有一个终端结点an,它无后件。(3)其它结点有且仅有一个前件,有且仅有一个后件;结点的个数n称为线性表长度,当n=0时,称为空表。在计算机中存放线性表,最简单的方法是顺序存储。元素所占用的空间是连续的;并在存储空间中依次存放。在具有n个元素的线性表(数组)中插入一个新的元素或删除指定的元素,平均情况下,都将移动n/2的元素。插入一个新的元素时从最后一个元素开始依次向后移动元素,直到空出插入的位置。删除指定的元素时从该删除位置的下一个位置开始依次向前移动元素,覆盖前面的元素。插入与删除是对数据结构的两种基本运算。对数据结构的处理使得其中的结点个数以及结点关系都动态的变化。线性表的运算(1)在线性表的指定位置加入一个新的元素(插入)。(2)在线性表中删除指定的元素(删除)。(3)在线性表中查找某个元素(查找)。(4)对线性表的元素进行整序(排序)。(5)分解线性表、合并线性表、复制线性表、逆转线性表。 1.4栈和队列,顺序栈与顺序队列1.栈栈,是一种特殊的线性表,栈是限制只在一端进行插入和删除操作的线性表,即只在栈顶(用一个指针Top指示)进行操作,栈底(用一个指Bottom指示)是封闭的,不允许进行操作,对栈的这种限制操作形成了“后进先出LIFO”或“先进后出FILO”的运算原则。栈具有记忆作用,它支持子函数的调用操作。在程序设计语言中,用一维数组S(1:m)作为栈的顺序存储空间,其中m为栈的最大容量。通常栈底指针指向栈空间的低地址一端(即数组的起始地址一端)。栈的基本运算(1)入栈运算——插入数据,Top=Top+1。(2)退栈运算——删除数据,Top=Top-1。栈满——进行入栈操作会产生“上溢”错误。栈空——进行出栈操作会产生“下溢”错误。(3)读栈顶元素——栈顶指针不动,将栈顶的元素赋值给一个变量。图1-22.队列队列,也是一种特殊的线性表,限制只在表的一端(队尾)进行入队操作,用一个指针rear来指示;限制在表的另一端(队头)进行出队操作,用一个指针front来指示;形成“先进先出FIFO”或“后进后出LILO”的运算原则。队尾指针rear总是指向刚入队的队尾新元素位置;队头指针front总是指向队头元素的前一个位置。队列的基本运算(1)入队操作——插入数据(在队尾),rear=rear+1。当队尾指针rear=m+1时,则置rear=1。(2)出队操作——删除数据(在对头),front=front+1。当队头指针front=m+1时,则置front=1。队满,进行入队操作时会产生“上溢出”错误。队空,进行出队操作时会产生“下溢出”错误。图1-33.循环队列在实际应用当中,队列的顺序存储结构一般采用循环队列的形式,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,以便于重复利用队列空间。在循环队列中,当存储空间的最后一个位置已被使用而再要进行入队运算时,只要存储空间的第一个位置空间,便可以将元素加入到第一个位置上,即将存储空间的第一个位置作为队尾,依次类推,循环利用这段存储空间。在循环队列中,当rear=front时不能说明是队列空还是队列满,因为循环队列中队头与队尾的指针会多次重合,需要增加一个标志变量s。当s=0时,表示队列为空;当s=1且rear=front时,表示队列为非空。注意:(1)栈和队列结构有什么共同特征?栈和队列都是限制在端点处进行操作的线性表;栈和队列都会发生存储空间“溢出”问题。(2)栈和队列产生“上溢出”和“下溢出”错误的位置?栈在“栈顶”位置当栈为满时,进行入栈操作,产生“上溢出”;在“栈底”位置当栈为空时,进行出栈操作,产生“下溢出”。队列在“队尾”位置,如果队列已满,进行入队操作,产生“上溢出”;在“队头”位置,如果队列已空,进行入队操作,产生“下溢出”。关于线性结构的几个例题1.数据的逻辑结构与数据的存储结构的关系?数据逻辑结构讨论数据元素的前后件对应关系,根据前后件的复杂程度分为:线性结构与非线性结构。数据存储结构是数据的逻辑结构在计算机内存中的存储形式分为:顺序、链接和索引。线性的逻辑结构在计算机中存储时可以采用顺序方式(顺序表、栈、队列、循环队列)或链接方式(线性链表、链栈、链队列)。非线性的逻辑结构(例如:树、二叉树)一般采用链式结构存储。图1-4以下分别为线性表的链式存储与顺序存储。图1-52.a,b,c,d依次进入栈中,那么可能的出栈顺序______。A.adcbB.abdcC.bacdD.dcab3.栈底至栈顶依次存放元素A、B、C、D,在第五个元素E入栈前,栈中元素可以出栈,则出栈序列可能是____。A.ABCEDB.DBCEAC.CDABED.DCBEA4.如何计算栈中存储的元素的个数?|Top-Bottom|+15.假设有50个数组元素构成循环队列(0——49)49号元素的后面是0号元。若队头的指针front指向6号元素,队尾的指针rear指向9号元素,则该循环队列中共有______个元素排队;若队头的指针front指向45号元素,队尾的指针rear指向10号元素,则该循环队列中共有_______个元素排队。图1-66.栈和与队列数据结构的异同点?栈和队列都是线性结构;都是限定在顺序表的某一端进行某种操作,并有指针指示;都有可能产生“溢出”错误;都要事先定义连续的存储空间。1.5线性链表1.线性表的缺点(1)插入、删除操作会移动大量数据元素,平均情况下也要移动一半的元素。(2)若存储空间已满,会出现“上溢出”错误,找不到足够的连续的存储空间会使程序中断。(3)多线性表的情况下不能很好的分配各自的存储空间。2.线性表的链式存储结构为了适应线性表的链式存储结构,计算机存储空间被划分成为一个一个的小块,每一小块占用若干字节,通常称为“存储结点”。一个存储结点有两部分构成:——数据域(数据元素的信息)。——指针域(用来指向前一个结点或后一个结点的所在存储空间的位置),也就是存放了逻辑上相邻而物理上不相邻的元素的内存地址。数据域指针域图1-7各个存储单元在物理存储空间上可以不连续,它们的逻辑关系由指针域来确定。线性表的链式存储结构称为线性链表。既要存储数据元素的信息(数据域),又要存储元素前后件的关系(指针域)。3.链式结构的优点(1)插入、删除操作不会移动各结点的数据元素。(2)不会出现“上溢出”错误。(3)支持存储空间的动态分配。思考:线性表的链式存储结构中怎样插入和删除链表中的元素?线性链表图1-8链栈图1-9链队列图1-10注意:线性表的顺序存储结构支持数据元素的顺序查找,也支持随机查找。线性表的链式存储结构只能支持顺序查找。 1.6树与二叉树1.关于树结构的几个概念树,是一种简单的非线性结构。所有的元素之间有明显的层次关系。树的特点:每一个结点只有一个前件,称为父结点。没有前件的结点只有一个,称为根结点。每一个结点可以有多个后件,称为子结点。没有后件的结点称为叶子结点。一个结点所拥有的后件(直接后件)的个数称为该结点的度。所有结点的最大的度数称为树的度。树中的结点分层排列,树的最大层数称为树的深度。图1-11图1-122.二叉树的特点(1)非空二叉树只有一个根结点;(2)每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。二叉树中的结点可以只有一个子结点,这时也要严格的区分是左子树还是右子树,也可以没有子结点,该结点称为叶子结点。图1-133.二叉树的基本性质(1)在二叉树的第k层上,最多有2k-1(k≥1)个结点。注意:以上公式是把二叉树的根结点作为第1层,如果假设二叉树的根结点在第0层,那么上面的公式将变成2k。(2)深度为m的二叉树最多有2m-1个结点。(3)度为0的结点(即叶子结点)总是比度为2的结点多一个。注意:可以用公式n0=n2+1来表示它们的关系n0表示叶子结点个数,n2表示2度点的个数。(4)具有n个结点的二叉树,其深度至少为[log2n]+1,其中[log2n]表示取log2n的整数部分。(5)具有n个结点的完全二叉树的深度为[log2n]+1。(6)设完全二叉树共有n个结点。如果从根结点开始,按层序(每一层从左到右)用自然数1,2,….n给结点进行编号(k=1,2….n),有以下结论:①若k=1,则该结点为根结点,它没有父结点;若k>1,则该结点的父结点编号为INT(k/2)。②若2k≤n,则编号为k的结点的左子结点编号为2k;否则该结点无左子结点(也无右子结点)。③若2k+1≤n,则编号为k的结点的右子结点编号为2k+1;否则该结点无右子结点。 4.满二叉树和完全二叉树满二叉树是指所有的层上的结点数均达到最大值的二叉树。在满二叉树的第k层上有2k-1个结点,且深度为m的二叉树上有2m-1个结点。完全二叉树是指除最后一层外,每一层上的结点数均达到最大值,在最后一层上只允许缺少右边的若干结点。如果从二叉树的根结点开始,对二叉树的结点从上往下,自左往右用自然数进行连续的编号,则深度为m、且有n个结点的二叉树,当且仅当每一个结点都与深度为m的满二叉树中编号从1到n的结点一一对应时,称之为“完全二叉树”。也就是说在完全二叉树中如果有一个点只有一个子结点,那么,它的子结点一定在左分支,并且,这个子结点没有右端的所有兄弟结点。(以下a图、b图是完全二叉树,c图不是完全二叉树)。 图1-14完全二叉树的叶结点只出现在最后两层上。所以,满二叉树是完全二叉树,反之不成立。二叉树存储结构采用链式存储结构。每一个结点包含三个部分:左指针域、数据域和右指针域。由于二叉树的存储结构中每一个存储结点有两个指针域,因此,二叉树的链式存储结构也称为“二叉链表”。左指针域数据域右指针域图1-15 5.二叉树的遍历二叉树的遍历:是指不重复的访问二叉树中的所有结点。对于二叉树中的每个结点,按照从上到下,从左到右的顺序顺次经过,每个结点都有三次机会经过它,也就有三次访问并存取结点中的数据。这样按照第1、2、3次访问的顺序,可以将一棵树的结点归为三个序列:前序、中序、后序。(1)前序遍历(DLR),对于每棵二叉树首先访问根结点,然后遍历左子树,最后遍历右子树,并且在遍历左右子树时,仍然先访问根结点,然后遍历左子树、最后遍历右子树。(2)中序遍历(LDR),对于每棵二叉树首先遍历左子树,然后访问根结点,最后遍历右子树,并且在遍历左右子树时,仍然先遍历左子树,然后访问根结点、最后遍历右子树。(3)后序遍历(LRD),对于每棵二叉树首先遍历左子树,然后遍历右子树,最后访问根结点,并且在遍历左右子树时,仍然先遍历左子树,然后遍历右子树、最后访问根结点。很显然,以上每一种遍历都是一个递归的过程。 二叉树(如图)从左上角开始根据路径顺次经过所有的结点,到右上角结束,所有的结点都是三次经过(如C结点)。将所有的结点按照同一种次序取出,分别形成以下遍历序列:二叉树中所有的结点都是在第1次经过时访问它们,形成为前序遍历序列ACBEDFG二叉树中所有的结点都是在第2次经过时访问它们,形成为中序遍历序列BCDEFAG二叉树中所有的结点都是在第3次经过时访问它们,形成为后序遍历序列BDFECGA 二叉树遍历的几点总结仅供参考:(1)根据中序遍历中根结点的位置可以确定左子树包含的结点与右子树包含的结点BCDEF(2)中序遍历的起始结点是二叉树最左边的结点BCD(3)中序遍历每棵子树都是左中右经过DEF(4)后序遍历任意二叉树都是先遍历所有下层的子结点再遍历上层的父结点BDFEC图1-161.7查找技术1.顺序查找顺序查找,是指从线性表的第一个元素(或最后一个元素)开始,依次将线性表中的所有元素与被查找的元素进行比较,若相等则表示找到(即查找成功);若线性表中所有的元素都与被查找的元素进行了比较但是都不相等,则表示线性表中找不到该元素(即查找失败)。在具有n个元素的线性表中进行顺序查找元素,其比较次数,最好的情况下为1,最坏的情况下为n,平均情况下大约为n/2。很显然,当线性表的长度n较大时,效率不高。但是,在下列两种情形下只能采用顺序查找:(1)如果线性表为无序表,不管是顺序存储结构还是链式存储结构都只能用顺序查找。(2)如果是有序的线性表,但采用链式存储结构,也只能用顺序查找。2.二分法查找二分法查找只适用于顺序存储的有序表,对于长度为n的有序线性表,最坏情况只需比较log2n次。1.8排序技术1.交换类排序法交换类的排序方法是借助数据元素之间的相互交换进行的一种排序。(1)冒泡排序法冒泡法的基本过程:首先,从线性表的开头往后扫描线性表,在扫描过程中逐次比较相邻两个元素的大小。若相邻两个元素中,前面的元素大于后面的元素,则将它们互换,称之为消去一个逆序。显然,在扫描过程中,不断的将两个相邻元素中的大者往后移动,最后将线性表中的最大元素换到了表的最后。这就是最大元素的正确位置。然后扫描剩余的元素,重复这个过程,就会将次大的元素换到表的最后。直到剩下的线性表为空,此时线性表变成有序表。冒泡排序法的时间复杂度为O(n(n-1)/2)(2)快速排序法选取某个元素T将线性表中比T小的元素移动到其左侧;将比其大的元素移动到其右侧,将线性表分成两个子表。2.插入类排序法(1)简单插入排序法将无序序列中的元素依次插入到已经有序的线性表中。简单插入法时间复杂度为O(n(n-1)/2)(2)希尔排序法将整个的无序序列分隔成若干小的子序列表,再分别在各个子表中进行插入排序。希尔排序法的时间复杂度为O(n1.5)3.选择类排序法(1)简单选择排序法扫描整个线性表,从中选出最小的元素,将它交换到表的最前面,对剩下的元素也用同样的方法,直到数据表空。简单的选择排序法的时间复杂度为O(n(n-1)/2)(2)堆排序法基于二叉树的排序方法,分为大堆排序和小堆排序两种。堆排序法的时间复杂度为O(nlog2n)例题:已知一颗完全二叉树的总结点数为n,求树中叶子结点的个数:叶子结点=n-[n/2][n/2]取整,表示树中的父结点数 课后习题1.算法的时间复杂度是指:_____A)执行算法程序所需要的时间复杂度B)算法程序的长度C)算法执行过程中所需要的基本运算的执行次数D)算法程序中的指令的条数2.算法的空间复杂是指:_____A)算法程序的长度B)算法程序中的指令的条数C)算法程序所占用的存储空间D)算法执行过程中所需要的存储空间3.以下叙述正确的是:_____A)线性表是线性结构B)栈和队列是非线性结构C)线性链表是非线性结构D)二叉树是线性结构4.数据的存储结构式指:_____A)数据所占的存储空间量B)数据的逻辑结构在计算机中表示C)数据在计算机中的顺序存储方式D)存储在外存中的数据5.下列关于队列的叙述中正确的是:______A)在队列中只能插入数据B)在队列中只能删除数据C)队列是先进先出的线性表D)队列是先进后出的线性表6.下列关于栈的叙述中正确的是:_____A)在栈中只能插入数据B)在栈中只能删除数据C)栈列是先进先出的线性表D)栈是先进后出的线性表7.假设有二叉树:如下图,对该二叉树进行中序遍历的结果为:_____A)ABCDEFB)DBEAFCC)ABDECFD)DEBFCA8.在深度为5的满二叉树中,叶子结点的个数为:_____A)32B)31C)16D)159.对长度为n的线性表进行顺序查找,在最坏情况下需要比较的
使用减半技术的前提:
数据是有序的(升序/降序)序列。
5.算法的复杂度
算法的复杂度主要包括:
时间复杂度和空间复杂度。
(1)算法的时间复杂度,是指执行算法时所需要的计算工作量;用算法执行过程中基本运算的执行次数来度量算法的工作量。
算法所执行的基本运算的次数是问题规模的函数。
算法的工作量=f(n)
n是问题的规模。
在同一个问题规模下,算法的执行次数取决于某一次特定的输入。
平均时间复杂度和最坏时间复杂度——是算法时间复杂度的两种评价标准。
(2)算法的空间复杂度,是指执行算法所需要的内存空间。
一个算法所需要的存储空间包括程序所占的空间、初始数据所占的空间和算法执行过程中的额外空间。
如果额外的空间相对于问题的规模来说是常量,则称该算法是“原地工作”。
例如:
借助某个变量将数组(任意大小)的所有元素翻转。
Main()
{ints[10]={0,1,2,3,4,5,6,7,8,9},i,j,x;
i=0,j=9;
while(i{x=s[i];s[i]=s[j];s[j]=x;i++;j--;}}1.2数据结构1.数据结构的概念(1)数据集合中各数据元素之间的逻辑关系,即数据的逻辑结构。(2)在对数据进行处理时,数据元素在计算机中的存储关系,即数据的存储结构。(3)对各种数据结构进行的运算。研究数据结构的目的:提高数据处理的效率;节省计算机的存储空间。在数据处理领域中,每一个需要处理的对象都可以抽象成数据元素,数据元素一般简称元素。一般情况下,在具有相同特征的数据元素集合中,各个数据元素之间存在有某种关系,这种关系反映了该集合中的数据元素所固有的一种结构。在数据处理领域中,通常把数据元素之间的固有关系简单的称为“前后件关系”。在某个数据元素前面的元素称为“直接前驱”,后面的元素称为“直接后驱”。一个数据结构应该包含以下两方面的信息:(1)表示数据元素的信息(数据元素本身)。(2)表示数据元素之间的前后件关系,是一种逻辑关系。2.数据的逻辑结构数据的逻辑结构,是指反映数据元素之间的逻辑关系(前后件关系)的数据结构。数据的逻辑结构中根据数据元素前后件关系的复杂程序分为:线性结构与非线性结构。线性结构,有且仅有一个根结点;每一个结点最多有一个前件,也最多有一个后件,也称为线性表。在一个线性结构中插入或删除任何一个结点后还应该是线性结构。可以这样表示B=(D,R)B表示数据结构;R表示数据元素之间的前后件关系;D表示数据元素。例如:一年四季B=(D,R)D={春,夏,秋,冬}R={(春,夏),(夏,秋),(秋,冬)}3.数据的存储结构数据的逻辑结构在计算机中的存放形式称为数据的存储结构(又称为物理结构)。在数据的存储结构中不仅存放各数据元素的信息,还要存放各数据元素前后件关系的信息。在实际进行数据处理时,被处理的各个数据元素总是被存放在计算机的存储空间中,并且各个数据元素在计算机存储空间中位置关系与它们的逻辑关系不一定相同。常用的存储结构:顺序、链接和索引。数据结构中的各个数据元素在计算机存储空间中的位置关系与逻辑关系可能是不同的。1.3线性表及其存储结构LinearList线性表中的每一个数据元素可以是简单项(数组),也可以是有多个数据项组成(表的每一条记录)。线性表,是最简单也是最常用的数据结构。例如:线性表中数据元素的位置只取决于它们自己的序号,即数据元素之间的相对位置是线性的。非空线性表的特征(1)有且仅有一个根结点a1,它无前件。(2)有且仅有一个终端结点an,它无后件。(3)其它结点有且仅有一个前件,有且仅有一个后件;结点的个数n称为线性表长度,当n=0时,称为空表。在计算机中存放线性表,最简单的方法是顺序存储。元素所占用的空间是连续的;并在存储空间中依次存放。在具有n个元素的线性表(数组)中插入一个新的元素或删除指定的元素,平均情况下,都将移动n/2的元素。插入一个新的元素时从最后一个元素开始依次向后移动元素,直到空出插入的位置。删除指定的元素时从该删除位置的下一个位置开始依次向前移动元素,覆盖前面的元素。插入与删除是对数据结构的两种基本运算。对数据结构的处理使得其中的结点个数以及结点关系都动态的变化。线性表的运算(1)在线性表的指定位置加入一个新的元素(插入)。(2)在线性表中删除指定的元素(删除)。(3)在线性表中查找某个元素(查找)。(4)对线性表的元素进行整序(排序)。(5)分解线性表、合并线性表、复制线性表、逆转线性表。 1.4栈和队列,顺序栈与顺序队列1.栈栈,是一种特殊的线性表,栈是限制只在一端进行插入和删除操作的线性表,即只在栈顶(用一个指针Top指示)进行操作,栈底(用一个指Bottom指示)是封闭的,不允许进行操作,对栈的这种限制操作形成了“后进先出LIFO”或“先进后出FILO”的运算原则。栈具有记忆作用,它支持子函数的调用操作。在程序设计语言中,用一维数组S(1:m)作为栈的顺序存储空间,其中m为栈的最大容量。通常栈底指针指向栈空间的低地址一端(即数组的起始地址一端)。栈的基本运算(1)入栈运算——插入数据,Top=Top+1。(2)退栈运算——删除数据,Top=Top-1。栈满——进行入栈操作会产生“上溢”错误。栈空——进行出栈操作会产生“下溢”错误。(3)读栈顶元素——栈顶指针不动,将栈顶的元素赋值给一个变量。图1-22.队列队列,也是一种特殊的线性表,限制只在表的一端(队尾)进行入队操作,用一个指针rear来指示;限制在表的另一端(队头)进行出队操作,用一个指针front来指示;形成“先进先出FIFO”或“后进后出LILO”的运算原则。队尾指针rear总是指向刚入队的队尾新元素位置;队头指针front总是指向队头元素的前一个位置。队列的基本运算(1)入队操作——插入数据(在队尾),rear=rear+1。当队尾指针rear=m+1时,则置rear=1。(2)出队操作——删除数据(在对头),front=front+1。当队头指针front=m+1时,则置front=1。队满,进行入队操作时会产生“上溢出”错误。队空,进行出队操作时会产生“下溢出”错误。图1-33.循环队列在实际应用当中,队列的顺序存储结构一般采用循环队列的形式,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,以便于重复利用队列空间。在循环队列中,当存储空间的最后一个位置已被使用而再要进行入队运算时,只要存储空间的第一个位置空间,便可以将元素加入到第一个位置上,即将存储空间的第一个位置作为队尾,依次类推,循环利用这段存储空间。在循环队列中,当rear=front时不能说明是队列空还是队列满,因为循环队列中队头与队尾的指针会多次重合,需要增加一个标志变量s。当s=0时,表示队列为空;当s=1且rear=front时,表示队列为非空。注意:(1)栈和队列结构有什么共同特征?栈和队列都是限制在端点处进行操作的线性表;栈和队列都会发生存储空间“溢出”问题。(2)栈和队列产生“上溢出”和“下溢出”错误的位置?栈在“栈顶”位置当栈为满时,进行入栈操作,产生“上溢出”;在“栈底”位置当栈为空时,进行出栈操作,产生“下溢出”。队列在“队尾”位置,如果队列已满,进行入队操作,产生“上溢出”;在“队头”位置,如果队列已空,进行入队操作,产生“下溢出”。关于线性结构的几个例题1.数据的逻辑结构与数据的存储结构的关系?数据逻辑结构讨论数据元素的前后件对应关系,根据前后件的复杂程度分为:线性结构与非线性结构。数据存储结构是数据的逻辑结构在计算机内存中的存储形式分为:顺序、链接和索引。线性的逻辑结构在计算机中存储时可以采用顺序方式(顺序表、栈、队列、循环队列)或链接方式(线性链表、链栈、链队列)。非线性的逻辑结构(例如:树、二叉树)一般采用链式结构存储。图1-4以下分别为线性表的链式存储与顺序存储。图1-52.a,b,c,d依次进入栈中,那么可能的出栈顺序______。A.adcbB.abdcC.bacdD.dcab3.栈底至栈顶依次存放元素A、B、C、D,在第五个元素E入栈前,栈中元素可以出栈,则出栈序列可能是____。A.ABCEDB.DBCEAC.CDABED.DCBEA4.如何计算栈中存储的元素的个数?|Top-Bottom|+15.假设有50个数组元素构成循环队列(0——49)49号元素的后面是0号元。若队头的指针front指向6号元素,队尾的指针rear指向9号元素,则该循环队列中共有______个元素排队;若队头的指针front指向45号元素,队尾的指针rear指向10号元素,则该循环队列中共有_______个元素排队。图1-66.栈和与队列数据结构的异同点?栈和队列都是线性结构;都是限定在顺序表的某一端进行某种操作,并有指针指示;都有可能产生“溢出”错误;都要事先定义连续的存储空间。1.5线性链表1.线性表的缺点(1)插入、删除操作会移动大量数据元素,平均情况下也要移动一半的元素。(2)若存储空间已满,会出现“上溢出”错误,找不到足够的连续的存储空间会使程序中断。(3)多线性表的情况下不能很好的分配各自的存储空间。2.线性表的链式存储结构为了适应线性表的链式存储结构,计算机存储空间被划分成为一个一个的小块,每一小块占用若干字节,通常称为“存储结点”。一个存储结点有两部分构成:——数据域(数据元素的信息)。——指针域(用来指向前一个结点或后一个结点的所在存储空间的位置),也就是存放了逻辑上相邻而物理上不相邻的元素的内存地址。数据域指针域图1-7各个存储单元在物理存储空间上可以不连续,它们的逻辑关系由指针域来确定。线性表的链式存储结构称为线性链表。既要存储数据元素的信息(数据域),又要存储元素前后件的关系(指针域)。3.链式结构的优点(1)插入、删除操作不会移动各结点的数据元素。(2)不会出现“上溢出”错误。(3)支持存储空间的动态分配。思考:线性表的链式存储结构中怎样插入和删除链表中的元素?线性链表图1-8链栈图1-9链队列图1-10注意:线性表的顺序存储结构支持数据元素的顺序查找,也支持随机查找。线性表的链式存储结构只能支持顺序查找。 1.6树与二叉树1.关于树结构的几个概念树,是一种简单的非线性结构。所有的元素之间有明显的层次关系。树的特点:每一个结点只有一个前件,称为父结点。没有前件的结点只有一个,称为根结点。每一个结点可以有多个后件,称为子结点。没有后件的结点称为叶子结点。一个结点所拥有的后件(直接后件)的个数称为该结点的度。所有结点的最大的度数称为树的度。树中的结点分层排列,树的最大层数称为树的深度。图1-11图1-122.二叉树的特点(1)非空二叉树只有一个根结点;(2)每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。二叉树中的结点可以只有一个子结点,这时也要严格的区分是左子树还是右子树,也可以没有子结点,该结点称为叶子结点。图1-133.二叉树的基本性质(1)在二叉树的第k层上,最多有2k-1(k≥1)个结点。注意:以上公式是把二叉树的根结点作为第1层,如果假设二叉树的根结点在第0层,那么上面的公式将变成2k。(2)深度为m的二叉树最多有2m-1个结点。(3)度为0的结点(即叶子结点)总是比度为2的结点多一个。注意:可以用公式n0=n2+1来表示它们的关系n0表示叶子结点个数,n2表示2度点的个数。(4)具有n个结点的二叉树,其深度至少为[log2n]+1,其中[log2n]表示取log2n的整数部分。(5)具有n个结点的完全二叉树的深度为[log2n]+1。(6)设完全二叉树共有n个结点。如果从根结点开始,按层序(每一层从左到右)用自然数1,2,….n给结点进行编号(k=1,2….n),有以下结论:①若k=1,则该结点为根结点,它没有父结点;若k>1,则该结点的父结点编号为INT(k/2)。②若2k≤n,则编号为k的结点的左子结点编号为2k;否则该结点无左子结点(也无右子结点)。③若2k+1≤n,则编号为k的结点的右子结点编号为2k+1;否则该结点无右子结点。 4.满二叉树和完全二叉树满二叉树是指所有的层上的结点数均达到最大值的二叉树。在满二叉树的第k层上有2k-1个结点,且深度为m的二叉树上有2m-1个结点。完全二叉树是指除最后一层外,每一层上的结点数均达到最大值,在最后一层上只允许缺少右边的若干结点。如果从二叉树的根结点开始,对二叉树的结点从上往下,自左往右用自然数进行连续的编号,则深度为m、且有n个结点的二叉树,当且仅当每一个结点都与深度为m的满二叉树中编号从1到n的结点一一对应时,称之为“完全二叉树”。也就是说在完全二叉树中如果有一个点只有一个子结点,那么,它的子结点一定在左分支,并且,这个子结点没有右端的所有兄弟结点。(以下a图、b图是完全二叉树,c图不是完全二叉树)。 图1-14完全二叉树的叶结点只出现在最后两层上。所以,满二叉树是完全二叉树,反之不成立。二叉树存储结构采用链式存储结构。每一个结点包含三个部分:左指针域、数据域和右指针域。由于二叉树的存储结构中每一个存储结点有两个指针域,因此,二叉树的链式存储结构也称为“二叉链表”。左指针域数据域右指针域图1-15 5.二叉树的遍历二叉树的遍历:是指不重复的访问二叉树中的所有结点。对于二叉树中的每个结点,按照从上到下,从左到右的顺序顺次经过,每个结点都有三次机会经过它,也就有三次访问并存取结点中的数据。这样按照第1、2、3次访问的顺序,可以将一棵树的结点归为三个序列:前序、中序、后序。(1)前序遍历(DLR),对于每棵二叉树首先访问根结点,然后遍历左子树,最后遍历右子树,并且在遍历左右子树时,仍然先访问根结点,然后遍历左子树、最后遍历右子树。(2)中序遍历(LDR),对于每棵二叉树首先遍历左子树,然后访问根结点,最后遍历右子树,并且在遍历左右子树时,仍然先遍历左子树,然后访问根结点、最后遍历右子树。(3)后序遍历(LRD),对于每棵二叉树首先遍历左子树,然后遍历右子树,最后访问根结点,并且在遍历左右子树时,仍然先遍历左子树,然后遍历右子树、最后访问根结点。很显然,以上每一种遍历都是一个递归的过程。 二叉树(如图)从左上角开始根据路径顺次经过所有的结点,到右上角结束,所有的结点都是三次经过(如C结点)。将所有的结点按照同一种次序取出,分别形成以下遍历序列:二叉树中所有的结点都是在第1次经过时访问它们,形成为前序遍历序列ACBEDFG二叉树中所有的结点都是在第2次经过时访问它们,形成为中序遍历序列BCDEFAG二叉树中所有的结点都是在第3次经过时访问它们,形成为后序遍历序列BDFECGA 二叉树遍历的几点总结仅供参考:(1)根据中序遍历中根结点的位置可以确定左子树包含的结点与右子树包含的结点BCDEF(2)中序遍历的起始结点是二叉树最左边的结点BCD(3)中序遍历每棵子树都是左中右经过DEF(4)后序遍历任意二叉树都是先遍历所有下层的子结点再遍历上层的父结点BDFEC图1-161.7查找技术1.顺序查找顺序查找,是指从线性表的第一个元素(或最后一个元素)开始,依次将线性表中的所有元素与被查找的元素进行比较,若相等则表示找到(即查找成功);若线性表中所有的元素都与被查找的元素进行了比较但是都不相等,则表示线性表中找不到该元素(即查找失败)。在具有n个元素的线性表中进行顺序查找元素,其比较次数,最好的情况下为1,最坏的情况下为n,平均情况下大约为n/2。很显然,当线性表的长度n较大时,效率不高。但是,在下列两种情形下只能采用顺序查找:(1)如果线性表为无序表,不管是顺序存储结构还是链式存储结构都只能用顺序查找。(2)如果是有序的线性表,但采用链式存储结构,也只能用顺序查找。2.二分法查找二分法查找只适用于顺序存储的有序表,对于长度为n的有序线性表,最坏情况只需比较log2n次。1.8排序技术1.交换类排序法交换类的排序方法是借助数据元素之间的相互交换进行的一种排序。(1)冒泡排序法冒泡法的基本过程:首先,从线性表的开头往后扫描线性表,在扫描过程中逐次比较相邻两个元素的大小。若相邻两个元素中,前面的元素大于后面的元素,则将它们互换,称之为消去一个逆序。显然,在扫描过程中,不断的将两个相邻元素中的大者往后移动,最后将线性表中的最大元素换到了表的最后。这就是最大元素的正确位置。然后扫描剩余的元素,重复这个过程,就会将次大的元素换到表的最后。直到剩下的线性表为空,此时线性表变成有序表。冒泡排序法的时间复杂度为O(n(n-1)/2)(2)快速排序法选取某个元素T将线性表中比T小的元素移动到其左侧;将比其大的元素移动到其右侧,将线性表分成两个子表。2.插入类排序法(1)简单插入排序法将无序序列中的元素依次插入到已经有序的线性表中。简单插入法时间复杂度为O(n(n-1)/2)(2)希尔排序法将整个的无序序列分隔成若干小的子序列表,再分别在各个子表中进行插入排序。希尔排序法的时间复杂度为O(n1.5)3.选择类排序法(1)简单选择排序法扫描整个线性表,从中选出最小的元素,将它交换到表的最前面,对剩下的元素也用同样的方法,直到数据表空。简单的选择排序法的时间复杂度为O(n(n-1)/2)(2)堆排序法基于二叉树的排序方法,分为大堆排序和小堆排序两种。堆排序法的时间复杂度为O(nlog2n)例题:已知一颗完全二叉树的总结点数为n,求树中叶子结点的个数:叶子结点=n-[n/2][n/2]取整,表示树中的父结点数 课后习题1.算法的时间复杂度是指:_____A)执行算法程序所需要的时间复杂度B)算法程序的长度C)算法执行过程中所需要的基本运算的执行次数D)算法程序中的指令的条数2.算法的空间复杂是指:_____A)算法程序的长度B)算法程序中的指令的条数C)算法程序所占用的存储空间D)算法执行过程中所需要的存储空间3.以下叙述正确的是:_____A)线性表是线性结构B)栈和队列是非线性结构C)线性链表是非线性结构D)二叉树是线性结构4.数据的存储结构式指:_____A)数据所占的存储空间量B)数据的逻辑结构在计算机中表示C)数据在计算机中的顺序存储方式D)存储在外存中的数据5.下列关于队列的叙述中正确的是:______A)在队列中只能插入数据B)在队列中只能删除数据C)队列是先进先出的线性表D)队列是先进后出的线性表6.下列关于栈的叙述中正确的是:_____A)在栈中只能插入数据B)在栈中只能删除数据C)栈列是先进先出的线性表D)栈是先进后出的线性表7.假设有二叉树:如下图,对该二叉树进行中序遍历的结果为:_____A)ABCDEFB)DBEAFCC)ABDECFD)DEBFCA8.在深度为5的满二叉树中,叶子结点的个数为:_____A)32B)31C)16D)159.对长度为n的线性表进行顺序查找,在最坏情况下需要比较的
{x=s[i];s[i]=s[j];s[j]=x;i++;j--;}
}
1.2数据结构
1.数据结构的概念
(1)数据集合中各数据元素之间的逻辑关系,即数据的逻辑结构。
(2)在对数据进行处理时,数据元素在计算机中的存储关系,即数据的存储结构。
(3)对各种数据结构进行的运算。
研究数据结构的目的:
提高数据处理的效率;节省计算机的存储空间。
在数据处理领域中,每一个需要处理的对象都可以抽象成数据元素,数据元素一般简称元素。
一般情况下,在具有相同特征的数据元素集合中,各个数据元素之间存在有某种关系,这种关系反映了该集合中的数据元素所固有的一种结构。
在数据处理领域中,通常把数据元素之间的固有关系简单的称为“前后件关系”。
在某个数据元素前面的元素称为“直接前驱”,后面的元素称为“直接后驱”。
一个数据结构应该包含以下两方面的信息:
(1)表示数据元素的信息(数据元素本身)。
(2)表示数据元素之间的前后件关系,是一种逻辑关系。
2.数据的逻辑结构
数据的逻辑结构,是指反映数据元素之间的逻辑关系(前后件关系)的数据结构。
数据的逻辑结构中根据数据元素前后件关系的复杂程序分为:
线性结构与非线性结构。
线性结构,有且仅有一个根结点;每一个结点最多有一个前件,也最多有一个后件,也称为线性表。
在一个线性结构中插入或删除任何一个结点后还应该是线性结构。
可以这样表示B=(D,R)
B表示数据结构;R表示数据元素之间的前后件关系;D表示数据元素。
一年四季B=(D,R)D={春,夏,秋,冬}R={(春,夏),(夏,秋),(秋,冬)}
3.数据的存储结构
数据的逻辑结构在计算机中的存放形式称为数据的存储结构(又称为物理结构)。
在数据的存储结构中不仅存放各数据元素的信息,还要存放各数据元素前后件关系的信息。
在实际进行数据处理时,被处理的各个数据元素总是被存放在计算机的存储空间中,并且各个数据元素在计算机存储空间中位置关系与它们的逻辑关系不一定相同。
常用的存储结构:
顺序、链接和索引。
数据结构中的各个数据元素在计算机存储空间中的位置关系与逻辑关系可能是不同的。
1.3线性表及其存储结构LinearList
线性表中的每一个数据元素可以是简单项(数组),也可以是有多个数据项组成(表的每一条记录)。
线性表,是最简单也是最常用的数据结构。
线性表中数据元素的位置只取决于它们自己的序号,即数据元素之间的相对位置是线性的。
非空线性表的特征
(1)有且仅有一个根结点a1,它无前件。
(2)有且仅有一个终端结点an,它无后件。
(3)其它结点有且仅有一个前件,有且仅有一个后件;结点的个数n称为线性表长度,当n=0时,称为空表。
在计算机中存放线性表,最简单的方法是顺序存储。
元素所占用的空间是连续的;并在存储空间中依次存放。
在具有n个元素的线性表(数组)中插入一个新的元素或删除指定的元素,平均情况下,都将移动n/2的元素。
插入一个新的元素时从最后一个元素开始依次向后移动元素,直到空出插入的位置。
删除指定的元素时从该删除位置的下一个位置开始依次向前移动元素,覆盖前面的元素。
插入与删除是对数据结构的两种基本运算。
对数据结构的处理使得其中的结点个数以及结点关系都动态的变化。
线性表的运算
(1)在线性表的指定位置加入一个新的元素(插入)。
(2)在线性表中删除指定的元素(删除)。
(3)在线性表中查找某个元素(查找)。
(4)对线性表的元素进行整序(排序)。
(5)分解线性表、合并线性表、复制线性表、逆转线性表。
1.4栈和队列,顺序栈与顺序队列
1.栈
栈,是一种特殊的线性表,栈是限制只在一端进行插入和删除操作的线性表,即只在栈顶(用一个指针Top指示)进行操作,栈底(用一个指Bottom指示)是封闭的,不允许进行操作,对栈的这种限制操作形成了“后进先出LIFO”或“先进后出FILO”的运算原则。
栈具有记忆作用,它支持子函数的调用操作。
在程序设计语言中,用一维数组S(1:
m)作为栈的顺序存储空间,其中m为栈的最大容量。
通常栈底指针指向栈空间的低地址一端(即数组的起始地址一端)。
栈的基本运算
(1)入栈运算——插入数据,Top=Top+1。
(2)退栈运算——删除数据,Top=Top-1。
栈满——进行入栈操作会产生“上溢”错误。
栈空——进行出栈操作会产生“下溢”错误。
(3)读栈顶元素——栈顶指针不动,将栈顶的元素赋值给一个变量。
图1-2
2.队列
队列,也是一种特殊的线性表,限制只在表的一端(队尾)进行入队操作,用一个指针rear来指示;限制在表的另一端(队头)进行出队操作,用一个指针front来指示;形成“先进先出FIFO”或“后进后出LILO”的运算原则。
队尾指针rear总是指向刚入队的队尾新元素位置;队头指针front总是指向队头元素的前一个位置。
队列的基本运算
(1)入队操作——插入数据(在队尾),rear=rear+1。
当队尾指针rear=m+1时,则置rear=1。
(2)出队操作——删除数据(在对头),front=front+1。
当队头指针front=m+1时,则置front=1。
队满,进行入队操作时会产生“上溢出”错误。
队空,进行出队操作时会产生“下溢出”错误。
图1-3
3.循环队列
在实际应用当中,队列的顺序存储结构一般采用循环队列的形式,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,以便于重复利用队列空间。
在循环队列中,当存储空间的最后一个位置已被使用而再要进行入队运算时,只要存储空间的第一个位置空间,便可以将元素加入到第一个位置上,即将存储空间的第一个位置作为队尾,依次类推,循环利用这段存储空间。
在循环队列中,当rear=front时不能说明是队列空还是队列满,因为循环队列中队头与队尾的指针会多次重合,需要增加一个标志变量s。
当s=0时,表示队列为空;当s=1且rear=front时,表示队列为非空。
注意:
(1)栈和队列结构有什么共同特征?
栈和队列都是限制在端点处进行操作的线性表;栈和队列都会发生存储空间“溢出”问题。
(2)栈和队列产生“上溢出”和“下溢出”错误的位置?
栈在“栈顶”位置当栈为满时,进行入栈操作,产生“上溢出”;在“栈底”位置当栈为空时,进行出栈操作,产生“下溢出”。
队列在“队尾”位置,如果队列已满,进行入队操作,产生“上溢出”;在“队头”位置,如果队列已空,进行入队操作,产生“下溢出”。
关于线性结构的几个例题
1.数据的逻辑结构与数据的存储结构的关系?
数据逻辑结构讨论数据元素的前后件对应关系,根据前后件的复杂程度分为:
数据存储结构是数据的逻辑结构在计算机内存中的存储形式分为:
线性的逻辑结构在计算机中存储时可以采用顺序方式(顺序表、栈、队列、循环队列)或链接方式(线性链表、链栈、链队列)。
非线性的逻辑结构(例如:
树、二叉树)一般采用链式结构存储。
图1-4
以下分别为线性表的链式存储与顺序存储。
图1-5
2.a,b,c,d依次进入栈中,那么可能的出栈顺序______。
A.adcbB.abdcC.bacdD.dcab
3.栈底至栈顶依次存放元素A、B、C、D,在第五个元素E入栈前,栈中元素可以出栈,则出栈序列可能是____。
A.ABCEDB.DBCEAC.CDABED.DCBEA
4.如何计算栈中存储的元素的个数?
|Top-Bottom|+1
5.假设有50个数组元素构成循环队列(0——49)49号元素的后面是0号元。
若队头的指针front指向6号元素,队尾的指针rear指向9号元素,则该循环队列中共有______个元素排队;
若队头的指针front指向45号元素,队尾的指针rear指向10号元素,则该循环队列中共有_______个元素排队。
图1-6
6.栈和与队列数据结构的异同点?
栈和队列都是线性结构;都是限定在顺序表的某一端进行某种操作,并有指针指示;都有可能产生“溢出”错误;都要事先定义连续的存储空间。
1.5线性链表
1.线性表的缺点
(1)插入、删除操作会移动大量数据元素,平均情况下也要移动一半的元素。
(2)若存储空间已满,会出现“上溢出”错误,找不到足够的连续的存储空间会使程序中断。
(3)多线性表的情况下不能很好的分配各自的存储空间。
2.线性表的链式存储结构
为了适应线性表的链式存储结构,计算机存储空间被划分成为一个一个的小块,每一小块占用若干字节,通常称为“存储结点”。
一个存储结点有两部分构成:
——数据域(数据元素的信息)。
——指针域(用来指向前一个结点或后一个结点的所在存储空间的位置),也就是存放了逻辑上相邻而物理上不相邻的元素的内存地址。
数据域
指针域
图1-7
各个存储单元在物理存储空间上可以不连续,它们的逻辑关系由指针域来确定。
线性表的链式存储结构称为线性链表。
既要存储数据元素的信息(数据域),又要存储元素前后件的关系(指针域)。
3.链式结构的优点
(1)插入、删除操作不会移动各结点的数据元素。
(2)不会出现“上溢出”错误。
(3)支持存储空间的动态分配。
思考:
线性表的链式存储结构中怎样插入和删除链表中的元素?
线性链表图1-8
链栈图1-9
链队列图1-10
线性表的顺序存储结构支持数据元素的顺序查找,也支持随机查找。
线性表的链式存储结构只能支持顺序查找。
1.6树与二叉树
1.关于树结构的几个概念
树,是一种简单的非线性结构。
所有的元素之间有明显的层次关系。
树的特点:
每一个结点只有一个前件,称为父结点。
没有前件的结点只有一个,称为根结点。
每一个结点可以有多个后件,称为子结点。
没有后件的结点称为叶子结点。
一个结点所拥有的后件(直接后件)的个数称为该结点的度。
所有结点的最大的度数称为树的度。
树中的结点分层排列,树的最大层数称为树的深度。
图1-11图1-12
2.二叉树的特点
(1)非空二叉树只有一个根结点;
(2)每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。
二叉树中的结点可以只有一个子结点,这时也要严格的区分是左子树还是右子树,也可以没有子结点,该结点称为叶子结点。
图1-13
3.二叉树的基本性质
(1)在二叉树的第k层上,最多有2k-1(k≥1)个结点。
以上公式是把二叉树的根结点作为第1层,如果假设二叉树的根结点在第0层,那么上面的公式将变成2k。
(2)深度为m的二叉树最多有2m-1个结点。
(3)度为0的结点(即叶子结点)总是比度为2的结点多一个。
可以用公式n0=n2+1来表示它们的关系n0表示叶子结点个数,n2表示2度点的个数。
(4)具有n个结点的二叉树,其深度至少为[log2n]+1,其中[log2n]表示取log2n的整数部分。
(5)具有n个结点的完全二叉树的深度为[log2n]+1。
(6)设完全二叉树共有n个结点。
如果从根结点开始,按层序(每一层从左到右)用自然数1,2,….n给结点进行编号(k=1,2….n),有以下结论:
①若k=1,则该结点为根结点,它没有父结点;若k>1,则该结点的父结点编号为INT(k/2)。
②若2k≤n,则编号为k的结点的左子结点编号为2k;否则该结点无左子结点(也无右子结点)。
③若2k+1≤n,则编号为k的结点的右子结点编号为2k+1;否则该结点无右子结点。
4.满二叉树和完全二叉树
满二叉树是指所有的层上的结点数均达到最大值的二叉树。
在满二叉树的第k层上有2k-1个结点,且深度为m的二叉树上有2m-1个结点。
完全二叉树是指除最后一层外,每一层上的结点数均达到最大值,在最后一层上只允许缺少右边的若干结点。
如果从二叉树的根结点开始,对二叉树的结点从上往下,自左往右用自然数进行连续的编号,则深度为m、且有n个结点的二叉树,当且仅当每一个结点都与深度为m的满二叉树中编号从1到n的结点一一对应时,称之为“完全二叉树”。
也就是说在完全二叉树中如果有一个点只有一个子结点,那么,它的子结点一定在左分支,并且,这个子结点没有右端的所有兄弟结点。
(以下a图、b图是完全二叉树,c图不是完全二叉树)。
图1-14
完全二叉树的叶结点只出现在最后两层上。
所以,满二叉树是完全二叉树,反之不成立。
二叉树存储结构采用链式存储结构。
每一个结点包含三个部分:
左指针域、数据域和右指针域。
由于二叉树的存储结构中每一个存储结点有两个指针域,因此,二叉树的链式存储结构也称为“二叉链表”。
左指针域
右指针域
图1-15
5.二叉树的遍历
二叉树的遍历:
是指不重复的访问二叉树中的所有结点。
对于二叉树中的每个结点,按照从上到下,从左到右的顺序顺次经过,每个结点都有三次机会经过它,也就有三次访问并存取结点中的数据。
这样按照第1、2、3次访问的顺序,可以将一棵树的结点归为三个序列:
前序、中序、后序。
(1)前序遍历(DLR),对于每棵二叉树首先访问根结点,然后遍历左子树,最后遍历右子树,并且在遍历左右子树时,仍然先访问根结点,然后遍历左子树、最后遍历右子树。
(2)中序遍历(LDR),对于每棵二叉树首先遍历左子树,然后访问根结点,最后遍历右子树,并且在遍历左右子树时,仍然先遍历左子树,然后访问根结点、最后遍历右子树。
(3)后序遍历(LRD),对于每棵二叉树首先遍历左子树,然后遍历右子树,最后访问根结点,并且在遍历左右子树时,仍然先遍历左子树,然后遍历右子树、最后访问根结点。
很显然,以上每一种遍历都是一个递归的过程。
二叉树(如图)从左上角开始根据路径顺次经过所有的结点,到右上角结束,所有的结点都是三次经过(如C结点)。
将所有的结点按照同一种次序取出,分别形成以下遍历序列:
二叉树中所有的结点都是在第1次经过时访问它们,形成为前序遍历序列ACBEDFG
二叉树中所有的结点都是在第2次经过时访问它们,形成为中序遍历序列BCDEFAG
二叉树中所有的结点都是在第3次经过时访问它们,形成为后序遍历序列BDFECGA
二叉树遍历的几点总结仅供参考:
(1)根据中序遍历中根结点的位置可以确定左子树包含的结点与右子树包含的结点BCDEF
(2)中序遍历的起始结点是二叉树最左边的结点BCD
(3)中序遍历每棵子树都是左中右经过DEF
(4)后序遍历任意二叉树都是先遍历所有下层的子结点再遍历上层的父结点BDFEC
图1-16
1.7查找技术
1.顺序查找
顺序查找,是指从线性表的第一个元素(或最后一个元素)开始,依次将线性表中的所有元素与被查找的元素进行比较,若相等则表示找到(即查找成功);若线性表中所有的元素都与被查找的元素进行了比较但是都不相等,则表示线性表中找不到该元素(即查找失败)。
在具有n个元素的线性表中进行顺序查找元素,其比较次数,最好的情况下为1,最坏的情况下为n,平均情况下大约为n/2。
很显然,当线性表的长度n较大时,效率不高。
但是,在下列两种情形下只能采用顺序查找:
(1)如果线性表为无序表,不管是顺序存储结构还是链式存储结构都只能用顺序查找。
(2)如果是有序的线性表,但采用链式存储结构,也只能用顺序查找。
2.二分法查找
二分法查找只适用于顺序存储的有序表,对于长度为n的有序线性表,最坏情况只需比较log2n次。
1.8排序技术
1.交换类排序法
交换类的排序方法是借助数据元素之间的相互交换进行的一种排序。
(1)冒泡排序法
冒泡法的基本过程:
首先,从线性表的开头往后扫描线性表,在扫描过程中逐次比较相邻两个元素的大小。
若相邻两个元素中,前面的元素大于后面的元素,则将它们互换,称之为消去一个逆序。
显然,在扫描过程中,不断的将两个相邻元素中的大者往后移动,最后将线性表中的最大元素换到了表的最后。
这就是最大元素的正确位置。
然后扫描剩余的元素,重复这个过程,就会将次大的元素换到表的最后。
直到剩下的线性表为空,此时线性表变成有序表。
冒泡排序法的时间复杂度为O(n(n-1)/2)
(2)快速排序法
选取某个元素T将线性表中比T小的元素移动到其左侧;将比其大的元素移动到其右侧,将线性表分成两个子表。
2.插入类排序法
(1)简单插入排序法
将无序序列中的元素依次插入到已经有序的线性表中。
简单插入法时间复杂度为O(n(n-1)/2)
(2)希尔排序法
将整个的无序序列分隔成若干小的子序列表,再分别在各个子表中进行插入排序。
希尔排序法的时间复杂度为O(n1.5)
3.选择类排序法
(1)简单选择排序法
扫描整个线性表,从中选出最小的元素,将它交换到表的最前面,对剩下的元素也用同样的方法,直到数据表空。
简单的选择排序法的时间复杂度为O(n(n-1)/2)
(2)堆排序法
基于二叉树的排序方法,分为大堆排序和小堆排序两种。
堆排序法的时间复杂度为O(nlog2n)
例题:
已知一颗完全二叉树的总结点数为n,求树中叶子结点的个数:
叶子结点=n-[n/2][n/2]取整,表示树中的父结点数
课后习题
1.算法的时间复杂度是指:
_____
A)执行算法程序所需要的时间复杂度B)算法程序的长度
C)算法执行过程中所需要的基本运算的执行次数D)算法程序中的指令的条数
2.算法的空间复杂是指:
A)算法程序的长度B)算法程序中的指令的条数
C)算法程序所占用的存储空间D)算法执行过程中所需要的存储空间
3.以下叙述正确的是:
A)线性表是线性结构B)栈和队列是非线性结构
C)线性链表是非线性结构D)二叉树是线性结构
4.数据的存储结构式指:
A)数据所占的存储空间量B)数据的逻辑结构在计算机中表示
C)数据在计算机中的顺序存储方式D)存储在外存中的数据
5.下列关于队列的叙述中正确的是:
______
A)在队列中只能插入数据B)在队列中只能删除数据
C)队列是先进先出的线性表D)队列是先进后出的线性表
6.下列关于栈的叙述中正确的是:
A)在栈中只能插入数据B)在栈中只能删除数据
C)栈列是先进先出的线性表D)栈是先进后出的线性表
7.假设有二叉树:
如下图,对该二叉树进行中序遍历的结果为:
A)ABCDEFB)DBEAFCC)ABDECFD)DEBFCA
8.在深度为5的满二叉树中,叶子结点的个数为:
A)32B)31C)16D)15
9.对长度为n的线性表进行顺序查找,在最坏情况下需要比较的
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1