1、全国计算机等级考试公共基础知识讲义全国计算机等级考试二级公共基础知识辅导讲义第一章 数据结构与算法第二章 程序设计基础第三章 软件工程基础第四章 数据库设计基础全国计算机等级考试二级公共基础知识辅导讲义第一章 数据结构与算法1.1 算法1、算法是指解题方案的准确而完整的描述。换句话说,算法是对特定问题求解步骤的一种描述。*:算法不等于程序,也不等于计算方法。程序的编制不可能优于算法的设计。2、算法的基本特征(1)可行性。针对实际问题而设计的算法,执行后能够得到满意的结果。(2)确定性。每一条指令的含义明确,无二义性。并且在任何条件下,算法只有唯一的一条执行路径,即相同的输入只能得出相同的输出。
2、(3)有穷性。算法必须在有限的时间内完成。有两重含义,一是算法中的操作步骤为有限个,二是每个步骤都能在有限时间内完成。(4)拥有足够的情报。算法中各种运算总是要施加到各个运算对象上,而这些运算对象又可能具有某种初始状态,这就是算法执行的起点或依据。因此,一个算法执行的结果总是与输入的初始数据有关,不同的输入将会有不同的结果输出。当输入不够或输入错误时,算法将无法执行或执行有错。一般说来,当算法拥有足够的情报时,此算法才是有效的;而当提供的情报不够时,算法可能无效。*:综上所述,所谓算法,是一组严谨地定义运算顺序的规则,并且每一个规则都是有效的,且是明确的,此顺序将在有限的次数下终止。3、算法复
3、杂度主要包括时间复杂度和空间复杂度。(1)算法时间复杂度是指执行算法所需要的计算工作量,可以用执行算法的过程中所需基本运算的执行次数来度量。(2)算法空间复杂度是指执行这个算法所需要的内存空间。1.2 数据结构的基本概念1、数据结构是指相互有关联的数据元素的集合。2、数据结构主要研究和讨论以下三个方面的问题:(1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构。数据的逻辑结构包含:1)表示数据元素的信息;2)表示各数据元素之间的前后件关系。(2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构。数据的存储结构有顺序、链接、索引等。1)顺序存储。它是把逻辑上相邻的
4、结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储表示称为顺序存储结构。2)链接存储。它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构。3)索引存储:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。*:数据的逻辑结构反映数据元素之间的逻辑关系,数据的存储结构(也称数据的物理结构)是数据的逻辑结构在计算机存储空间中的存放形式。同一种逻辑结构的数据可以采用不同的存储结构,但影响数据处理效率。(3)对各种数据结构进行的运算。3、数据结构的图形表示一个数据结构除了用二元关系表示
5、外,还可以直观地用图形表示。在数据结构的图形表示中,对于数据集合D中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,并简称为结点;为了进一步表示各数据元素之间的前后件关系,对于关系R中的每一个二元组,用一条有向线段从前件结点指向后件结点。4、数据结构分为两大类型:线性结构和非线性结构。(1、数据结构是指相互有关联的数据元素的集合。2、数据结构主要研究和讨论以下三个方面的问题(1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构。数据的逻辑结构包含:1)表示数据元素的信息;2)表示各数据元素之间的前后件关系。(2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数
6、据的存储结构。数据的存储结构有顺序、链接、索引等(3)对各种数据结构进行的运算。4、数据结构分为两大类型:线性结构和非线性结构1)线性结构(非空的数据结构)条件:1)有且只有一个根结点;2)每一个结点最多有一个前件,也最多有一个后件。*:常见的线性结构有线性表、栈、队列和线性链表等。(2)非线性结构:不满足线性结构条件的数据结构。*:常见的非线性结构有树、二叉树和图等。1.3 线性表及其顺序存储结构1、线性表由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的。线性表是由n(n0)个数据元素组成的一个有限序列,表中的每一个数据元素,除了第一个外,有且只有一个前件,除
7、了最后一个外,有且只有一个后件。线性表中数据元素的个数称为线性表的长度。线性表可以为空表。*:线性表是一种存储结构,它的存储方式:顺序和链式。2、线性表的顺序存储结构具有两个基本特点:(1)线性表中所有元素所占的存储空间是连续的;(2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。*:由此可以看出,在线性表的顺序存储结构中,其前后件两个元素在存储空间中是紧邻的,且前件元素一定存储在后件元素的前面,可以通过计算机直接确定第i个结点的存储地址。3、顺序表的插入、删除运算(1)顺序表的插入运算:在一般情况下,要在第i(1in)个元素之前插入一个新元素时,首先要从最后一个(即第n个)元素开始,
8、直到第i个元素之间共n-i+1个元素依次向后移动一个位置,移动结束后,第i个位置就被空出,然后将新元素插入到第i项。插入结束后,线性表的长度就增加了1。*:顺性)个元素时,则要从第i+1个元素开始,直到第n个元素之间共n-i个元素依次向前移动一个位置。删除结束后,表的插入运算时需要移动元素,在等概率情况下,平均需要移动n/2个元素。(2)顺序表的删除运算:在一般情况下,要删除第i(1in线性表的长度就减小了1。*:进行顺性表的删除运算时也需要移动元素,在等概率情况下,平均需要移动(n-1)/2个元素。插入、删除运算不方便。1.4 栈和队列1、栈及其基本运算栈是限定在一端进行插入与删除运算的线性
9、表。在栈中,允许插入与删除的一端称为栈顶,不允许插入与删除的另一端称为栈底。栈顶元素总是最后被插入的元素,栈底元素总是最先被插入的元素。即栈是按照“先进后出”或“后进先出”的原则组织数据的。栈具有记忆作用。栈的基本运算:1)插入元素称为入栈运算;2)删除元素称为退栈运算;3)读栈顶元素是将栈顶元素赋给一个指定的变量,此时指针无变化。栈的存储方式和线性表类似,也有两种,即顺序栈和链式栈。2、队列及其基本运算队列是指允许在一端(队尾)进入插入,而在另一端(队头)进行删除的线性表。尾指针(Rear)指向队尾元素,头指针(front)指向排头元素的前一个位置(队头)。队列是“先进先出”或“后进后出”的
10、线性表。队列运算包括:1)入队运算:从队尾插入一个元素;2)退队运算:从队头删除一个元素。循环队列及其运算:所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置,因此,从头指针front指向的后一个位置直到队尾指针rear指向的位置之间,所有的元素均为队列中的元素。*:循环队列中元素的个数=rear-front。1.5 线性链表1、线性表顺序存储的缺点:(1)插入或删除的运算效率很低。在顺序存储的线性表中,插入或删除数据元素时需要移动大量的数据元素;
11、(2)线性表的顺序存储结构下,线性表的存储空间不便于扩充;(3)线性表的顺序存储结构不便于对存储空间的动态分配。2、线性链表:线性表的链式存储结构称为线性链表,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接来实现的。因此,在链式存储方式中,每个结点由两部分组成:一部分用于存放数据元素的值,称为数据域;另一部分用于存放指针,称为指针域,用于指向该结点的前一个或后一个结点(即前件或后件),如下图所示:线性链表分为单链表、双向链表和循环链表三种类型。在单链表中,每一个结点只有一个指针域,由这个指针只能找到其后件结点,而不能找到其前件结点。因此,在某些应用中,对
12、于线性链表中的每个结点设置两个指针,一个称为左指针,指向其前件结点;另一个称为右指针,指向其后件结点,这种链表称为双向链表,如下图所示:3、线性链表的基本运算(1)在线性链表中包含指定元素的结点之前插入一个新元素。*:在线性链表中插入元素时,不需要移动数据元素,只需要修改相关结点指针即可,也不会出现“上溢”现象。(2)在线性链表中删除包含指定元素的结点。*:在线性链表中删除元素时,也不需要移动数据元素,只需要修改相关结点指针即可。(3)将两个线性链表按要求合并成一个线性链表。(4)将一个线性链表按要求进行分解。(5)逆转线性链表。 (6)复制线性链表。(7)线性链表的排序。 (8)线性链表的查
13、找。*:线性链表不能随机存取。4、循环链表及其基本运算在线性链表中,其插入与删除的运算虽然比较方便,但还存在一个问题,在运算过程中对于空表和对第一个结点的处理必须单独考虑,使空表与非空表的运算不统一。为了克服线性链表的这个缺点,可以采用另一种链接方式,即循环链表。与前面所讨论的线性链表相比,循环链表具有以下两个特点:1)在链表中增加了一个表头结点,其数据域为任意或者根据需要来设置,指针域指向线性表的第一个元素的结点,而循环链表的头指针指向表头结点;2)循环链表中最后一个结点的指针域不是空,而是指向表头结点。即在循环链表中,所有结点的指针构成了一个环状链。下图a是一个非空的循环链表,图b是一个空
14、的循环链表:循环链表的优点主要体现在两个方面:一是在循环链表中,只要指出表中任何一个结点的位置,就可以从它出发访问到表中其他所有的结点,而线性单链表做不到这一点;二是由于在循环链表中设置了一个表头结点,在任何情况下,循环链表中至少有一个结点存在,从而使空表与非空表的运算统一。*:循环链表是在单链表的基础上增加了一个表头结点,其插入和删除运算与单链表相同。但它可以从任一结点出发来访问表中其他所有结点,并实现空表与非空表的运算的统一。1.6 树与二叉树1、树的基本概念树是一种简单的非线性结构。在树这种数据结构中,所有数据元素之间的关系具有明显的层次特性。在树结构中,每一个结点只有一个前件,称为父结
15、点。没有前件的结点只有一个,称为树的根结点,简称树的根。每一个结点可以有多个后件,称为该结点的子结点。没有后件的结点称为叶子结点。在树结构中,一个结点所拥有的后件的个数称为该结点的度,所有结点中最大的度称为树的度。树的最大层次称为树的深度。2、二叉树及其基本性质(1)什么是二叉树二叉树是一种很有用的非线性结构,它具有以下两个特点:1)非空二叉树只有一个根结点;2)每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。*:根据二叉树的概念可知,二叉树的度可以为0(叶结点)、1(只有一棵子树)或2(有2棵子树)。(2)二叉树的基本性质性质1 在二叉树的第k层上,最多有 个结点。性质2 深度为
16、m的二叉树最多有个 个结点。性质3 在任意一棵二叉树中,度数为0的结点(即叶子结点)总比度为2的结点多一个。性质4 具有n个结点的二叉树,其深度至少为 ,其中 表示取 的整数部分。3、满二叉树与完全二叉树满二叉树:除最后一层外,每一层上的所有结点都有两个子结点。完全二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。*:根据完全二叉树的定义可得出:度为1的结点的个数为0或1。下图a表示的是满二叉树,下图b表示的是完全二叉树:完全二叉树还具有如下两个特性:性质5 具有n个结点的完全二叉树深度为 。性质6 设完全二叉树共有n个结点,如果从根结点开始,按层序(每一层
17、从左到右)用自然数1,2,n给结点进行编号,则对于编号为k(k=1,2,n)的结点有以下结论:若k=1,则该结点为根结点,它没有父结点;若k1,则该结点的父结点的编号为INT(k/2)。若2kn,则编号为k的左子结点编号为2k;否则该结点无左子结点(显然也没有右子结点)。若2k+1n,则编号为k的右子结点编号为2k+1;否则该结点无右子结点。4、二叉树的存储结构在计算机中,二叉树通常采用链式存储结构。与线性链表类似,用于存储二叉树中各元素的存储结点也由两部分组成:数据域和指针域。但在二叉树中,由于每一个元素可以有两个后件(即两个子结点),因此,用于存储二叉树的存储结点的指针域有两个:一个用于指
18、向该结点的左子结点的存储地址,称为左指针域;另一个用于指向该结点的右子结点的存储地址,称为右指针域。*:一般二叉树通常采用链式存储结构,对于满二叉树与完全二叉树来说,可以按层序进行顺序存储。5、二叉树的遍历(c)二叉树二叉树的遍历是指不重复地访问二叉树中的所有结点。二叉树的遍历可以分为以下三种:(1)前序遍历(DLR):若二叉树为空,则结束返回。否则:首先访问根结点,然后遍历左子树,最后遍历右子树;并且,在遍历左右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。图C二叉树前序的遍历结果为:F,C,A,D,B,E,G,H,P。(2)中序遍历(LDR):若二叉树为空,则结束返回。否则:首
19、先遍历左子树,然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。图C二叉树中序的遍历结果为:A,C,B,D,F,E,H,G,P。(3)后序遍历(LRD):若二叉树为空,则结束返回。否则:首先遍历左子树,然后遍历右子树,最后访问根结点,并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。图C二叉树后序的遍历结果为:A,B,D,C.H,P,G,E,F。1.7 查找技术查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。查找结果:(查找成功:找到;查找不成功:没找到。)平均查找长度:查找过程中关键字
20、和给定值比较的平均次数。1、顺序查找基本思想:从表中的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到两者相符,查到所要找的元素为止。否则就是表中没有要找的元素,查找不成功。在平均情况下,利用顺序查找法在线性表中查找一个元素,大约要与线性表中一半的元素进行比较,最坏情况下需要比较n次。顺序查找一个具有n个元素的线性表,其平均复杂度为O(n)。下列两种情况下只能采用顺序查找:1)如果线性表是无序表(即表中的元素是无序的),则不管是顺序存储结构还是链式存储结构,都只能用顺序查找。2)即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。2、二分法查找思想:先确定待查找记录所在的范
21、围,然后逐步缩小范围,直到找到或确认找不到该记录为止。前提:必须在具有顺序存储结构的有序表中进行。查找过程:1)若中间项(中间项mid=(n-1)/2,mid的值四舍五入取整)的值等于x,则说明已查到;2)若x小于中间项的值,则在线性表的前半部分查找;3)若x大于中间项的值,则在线性表的后半部分查找。特点:比顺序查找方法效率高。最坏的情况下,需要比较log2n次。*:二分法查找只适用于顺序存储的线性表,且表中元素必须按关键字有序(升序)排列。对于无序线性表和线性表的链式存储结构只能用顺序查找。在长度为n的有序线性表中进行二分法查找,其时间复杂度为O(log2n)。1.8 排序技术排序是指将一个
22、无序序列整理成按值非递减顺序排列的有序序列,即是将无序的记录序列调整为有序记录序列的一种操作。1、交换类排序法(方法:冒泡排序,快速排序)。2、插入类排序法(方法:简单插入排序,希尔排序)。3、选择类排序法(方法:简单选择排序,堆排序)。总结:各种排序法比较:本章应考点拨:本章内容在笔试中会出现5-6个题目,是公共基础知识部分出题量比较多的一章,所占分值也比较大,约10分。1.9 全真试题训练一、选择题(1)长度为10的顺序表的首地址是从1023开始的,顺序表中的每个元素的长度为2,在第4个元素前面插入一个元素和删除第7个元素后,顺序表的总长度还是不变。问在执行插入和删除操作前,顺序表中第5个
23、元素在执行插入和删除操作后在顺序表中的存储地址是A)1028 B)1029 C)1031 D)1033(2)下列关于线性表的两种存储结构叙述正确的是A)若存储相同数目的元素,则线性链表比顺序表要节省存储空间B)对无序表的查找,顺序表和线性链表的效率基本上是一样的C)顺序表适用于插入,删除等更新操作频繁的场合D)线性表适用于查询操作比较频繁的场合(3)已知元素的人栈顺序为abcde ,则下列哪种出栈顺序是不可能的(出栈和入栈操作可交叉进行)?A)edcba B)cabde C)dcbae D)bcdea(4)在线性链表的插入算法中,若要把结点q插在结点p后面,下列操作正确的是:A)使结点p指向结
24、点q,再使结点q指向结点p的后件结点 B)使结点q指向p的后件结点,再使结点p指向结点q C)使结点q指向结点p的后件结点,再使结点q指向结点p D)使结点p指向q的后件结点,再使结点q指向结点p (5)下列叙述中错误的是:A)循环链表中,通过表中的任何一个结点可以访问到表中其他所有的结点B)线性链表的插入和删除效率比顺序表的插入和删除效率高C)线性链表与顺序表相比,它容易实现动态增长D)在线性链表中查找一个元素要比在顺序中查找一个元素快(6)一棵度数为4的树,它的4度结点有1个,3度结点有2个,2度结点有3个,1度结点4个,问它的叶子结点有多少个?A)5 B)6 C)9 D)11(7)一棵深
25、度为m的二叉树2m-1个结点,则最多可以断定此二叉树是A)满二叉树 B)一般的完全二叉树C)一般的二叉树 D)一般的树(8)以下四种树中不是完全二叉树的是A) B) C) D)(9)在一个xm的二维线性表中顺序查找一个数据元素的算法时间复杂度是A)O(n+m) B)O(nm) C)O(n2) D)O(m2)(10)下面排序算法中,平均排序速度最快的是A)冒泡排序法 B)选择排序法 C)交换排序法 D)堆排序法(11)下面哪一个不是算法的基本特征?A)可靠性 B)确定性 C)有穷性 D)拥有足够的情报(12)通过列举少量的特殊情况,经过分析,最后找出一般的关系的算法设计思想是A)列举法 B)归纳
26、法 C)递推法 D)递归法(13)常用于解决“是否存在”或“有多少种可能”等类型的问题(例如求解不定议程的问题)的算法设计基本方法是A)归纳法 B)递推法 C)列举法 D)减半递推技术(14)以下算法设计基本方法中基本思想不属于归纳法的是A)递推法 B)递归法 C)减半递推技术 D)回溯法(15)在用于分法求解议程在一个闭区间上的实根时,采用的算法设计技术是A)列举法 B)归纳法 C)递归法 D)减半递推法(16)右下图表示的数据结构是A)D=di |1=i=6=d1,d2,d3,d4,d5,d6 R=(d1,d2),(d1,d3),(d3,d4)(d5,d4),(d5,d6)B)D=di|1
27、=i=6=d1,d2,d3,d4,d5,d6 R=(d1,d2),(d1,d3),(d3,d4),(d3,d5),(d5,d4),(d5,d6)C)D=di|1=i=6=d1,d2,d3,d4,d5,d6 R=(d1,d2),(d1,d3),(d3,d4),(d3,d5),(d5,d6)D)D=di|1=i=6=d1,d2,d3,d4,d5,d6 R=(d1,d2),(d1,d3),(d3,d4),(d5,d3),(d5,d4),(d5,d6)(17)已知线性表的首元素的地址是1025,每个数据元素的长度为2,则第10个元素的地址为A)1035 B)1045 C)1027 D)1043(18)
28、下列关于链表结构的叙述正确的是A)线性链表、带链的栈和带链的队列的结点的结构都是相同的B)双向链表也就是循环链表C)线性链表与带链的栈的结点的结构是不同的D)在循环链表中通过任意一个结点可以找到链表中其他所有的结点,而在双向链表中做不到这一点(19)在表示树的多重链表中,除了要存储结点的值和多个指针之外,还必须需要存储A)结点的度 B)结点的层次 C)结点的高度 D)结点的深度(20)树T的度为4,其中度为1,2,3,4的结点个数分别为4,2,1,1。则T中的叶子结点数为A)8 B)7 C)6 D)5(21)具有8个结点的完全二叉树中编号为4的结点的右子结点的编号为A)8 B)9 C)无此结点
29、 D)8或是9(22)通过相邻数据元素的交换逐步将线性表变成有序的排序方法是A)冒泡排序法 B)简单选择排序法C)简单插入排序法 D)希尔排序法(23)快速排序法属于A)选择类排序法 B)交换类排序法C)插入类排序法 D)归并类排序法(24)对长度为n的线性表进行推排序的时间复杂度是A)O(n) B)O(nlog2n) C)O(n2) D)O(n1.5)一、选择题(1)D (2)B (3)B (4)B (5)D(6)D (7)A (8)D (9)B (10)D(11)A (12)B (13)C (14)D (15)D (16)B (17)D (18)A (19)A (20)A (21)C (2
30、2)A (23)B (24)B二、填空题(1)假如刚开始时栈为空,依次有A,B,C,D四个元素入栈,此时栈底指针指向元素 1 ,栈顶指针值为 2 (假设每个元素的长度为1)。执行四次出栈操作后把E,F,G压入栈,问此时栈底指针指向元素 3 ,此时栈的长度为 4 。(2)在一个容量为15的循环险旬中,若头指针front=6, 尾指针rear=4,则该循环队列中共有5个元素;若头指针front=4,尾指针rear=6,则该循环队列中共有 6 个元素;若头指针front=6,尾指针rear=6,则该循环队列中共有 7 个元素。(3)拥有奇数个结点的完全二叉树中有4个内部结点(非叶子结点),请问它的叶
31、子结点数是 8 。(4)请写出用二分查找法在有序顺序表(1,2,3,4,6,8,9,11)中查找3的比较序列 9 。(5)设一棵二叉树的中序遍历结果为DBEACF,前序遍历结果为ABDECF,则后序遍历结果为 10 。(6)请写出用冒泡排序法对序列(5,1,7,3,1,6,9,3,2,7,6)进行第一遍扫描后的中间结果是 11 。(7)请写出用冒泡排序法对序列(5,1,7,3,1,6,9,3,2,7,6)进行第一遍扫描后的中间结果是 12 。(8)请写出用简单选择排序法对序列(5,1,7,3,1,6,9,3,2,7,6)进行第一遍扫描后的中间结果是 13 。(9)一个算法通常由两种基本要素组成,一是对数据对象的运算和操作,二是 14 。(10)在一般的计算机系统中,有算术运算、逻辑运算、关系运算和 15 四类基本的操作和运算。(