全国计算机等级考试公共基础知识讲义文档格式.docx
《全国计算机等级考试公共基础知识讲义文档格式.docx》由会员分享,可在线阅读,更多相关《全国计算机等级考试公共基础知识讲义文档格式.docx(46页珍藏版)》请在冰豆网上搜索。
1)顺序存储。
它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。
由此得到的存储表示称为顺序存储结构。
2)链接存储。
它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。
由此得到的存储表示称为链式存储结构。
3)索引存储:
除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
数据的逻辑结构反映数据元素之间的逻辑关系,数据的存储结构(也称数据的物理结构)是数据的逻辑结构在计算机存储空间中的存放形式。
同一种逻辑结构的数据可以采用不同的存储结构,但影响数据处理效率。
(3)对各种数据结构进行的运算。
3、数据结构的图形表示
一个数据结构除了用二元关系表示外,还可以直观地用图形表示。
在数据结构的图形表示中,对于数据集合D中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,并简称为结点;
为了进一步表示各数据元素之间的前后件关系,对于关系R中的每一个二元组,用一条有向线段从前件结点指向后件结点。
4、数据结构分为两大类型:
线性结构和非线性结构。
(1)线性结构(非空的数据结构)条件:
1)有且只有一个根结点;
2)每一个结点最多有一个前件,也最多有一个后件。
常见的线性结构有线性表、栈、队列和线性链表等。
(2)非线性结构:
不满足线性结构条件的数据结构。
常见的非线性结构有树、二叉树和图等。
1.3线性表及其顺序存储结构
1、线性表由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的。
线性表是由n(n≥0)个数据元素组成的一个有限序列,表中的每一个数据元素,除了第一个外,有且只有一个前件,除了最后一个外,有且只有一个后件。
线性表中数据元素的个数称为线性表的长度。
线性表可以为空表。
线性表是一种存储结构,它的存储方式:
顺序和链式。
2、线性表的顺序存储结构具有两个基本特点:
(1)线性表中所有元素所占的存储空间是连续的;
(2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
由此可以看出,在线性表的顺序存储结构中,其前后件两个元素在存储空间中是紧邻的,且前件元素一定存储在后件元素的前面,可以通过计算机直接确定第i个结点的存储地址。
3、顺序表的插入、删除运算
(1)顺序表的插入运算:
在一般情况下,要在第i(1≤i≤n)个元素之前插入一个新元素时,首先要从最后一个(即第n个)元素开始,直到第i个元素之间共n-i+1个元素依次向后移动一个位置,移动结束后,第i个位置就被空出,然后将新元素插入到第i项。
插入结束后,线性表的长度就增加了1。
顺性表的插入运算时需要移动元素,在等概率情况下,平均需要移动n/2个元素。
(2)顺序表的删除运算:
在一般情况下,要删除第i(1≤i≤n)个元素时,则要从第i+1个元素开始,直到第n个元素之间共n-i个元素依次向前移动一个位置。
删除结束后,线性表的长度就减小了1。
进行顺性表的删除运算时也需要移动元素,在等概率情况下,平均需要移动(n-1)/2个元素。
插入、删除运算不方便。
1.4栈和队列
1、栈及其基本运算
栈是限定在一端进行插入与删除运算的线性表。
在栈中,允许插入与删除的一端称为栈顶,不允许插入与删除的另一端称为栈底。
栈顶元素总是最后被插入的元素,栈底元素总是最先被插入的元素。
即栈是按照“先进后出”或“后进先出”的原则组织数据的。
栈具有记忆作用。
栈的基本运算:
1)插入元素称为入栈运算;
2)删除元素称为退栈运算;
3)读栈顶元素是将栈顶元素赋给一个指定的变量,此时指针无变化。
栈的存储方式和线性表类似,也有两种,即顺序栈和链式栈。
2、队列及其基本运算
队列是指允许在一端(队尾)进入插入,而在另一端(队头)进行删除的线性表。
尾指针(Rear)指向队尾元素,头指针(front)指向排头元素的前一个位置(队头)。
队列是“先进先出”或“后进后出”的线性表。
队列运算包括:
1)入队运算:
从队尾插入一个元素;
2)退队运算:
从队头删除一个元素。
循环队列及其运算:
所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。
在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置,因此,从头指针front指向的后一个位置直到队尾指针rear指向的位置之间,所有的元素均为队列中的元素。
循环队列中元素的个数=rear-front。
1.5线性链表
1、线性表顺序存储的缺点:
(1)插入或删除的运算效率很低。
在顺序存储的线性表中,插入或删除数据元素时需要移动大量的数据元素;
(2)线性表的顺序存储结构下,线性表的存储空间不便于扩充;
(3)线性表的顺序存储结构不便于对存储空间的动态分配。
2、线性链表:
线性表的链式存储结构称为线性链表,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接来实现的。
因此,在链式存储方式中,每个结点由两部分组成:
一部分用于存放数据元素的值,称为数据域;
另一部分用于存放指针,称为指针域,用于指向该结点的前一个或后一个结点(即前件或后件),如下图所示:
线性链表分为单链表、双向链表和循环链表三种类型。
在单链表中,每一个结点只有一个指针域,由这个指针只能找到其后件结点,而不能找到其前件结点。
因此,在某些应用中,对于线性链表中的每个结点设置两个指针,一个称为左指针,指向其前件结点;
另一个称为右指针,指向其后件结点,这种链表称为双向链表,如下图所示:
3、线性链表的基本运算
(1)在线性链表中包含指定元素的结点之前插入一个新元素。
在线性链表中插入元素时,不需要移动数据元素,只需要修改相关结点指针即可,也不会出现“上溢”现象。
(2)在线性链表中删除包含指定元素的结点。
在线性链表中删除元素时,也不需要移动数据元素,只需要修改相关结点指针即可。
(3)将两个线性链表按要求合并成一个线性链表。
(4)将一个线性链表按要求进行分解。
(5)逆转线性链表。
(6)复制线性链表。
(7)线性链表的排序。
(8)线性链表的查找。
线性链表不能随机存取。
4、循环链表及其基本运算
在线性链表中,其插入与删除的运算虽然比较方便,但还存在一个问题,在运算过程中对于空表和对第一个结点的处理必须单独考虑,使空表与非空表的运算不统一。
为了克服线性链表的这个缺点,可以采用另一种链接方式,即循环链表。
与前面所讨论的线性链表相比,循环链表具有以下两个特点:
1)在链表中增加了一个表头结点,其数据域为任意或者根据需要来设置,指针域指向线性表的第一个元素的结点,而循环链表的头指针指向表头结点;
2)循环链表中最后一个结点的指针域不是空,而是指向表头结点。
即在循环链表中,所有结点的指针构成了一个环状链。
下图a是一个非空的循环链表,图b是一个空的循环链表:
循环链表的优点主要体现在两个方面:
一是在循环链表中,只要指出表中任何一个结点的位置,就可以从它出发访问到表中其他所有的结点,而线性单链表做不到这一点;
二是由于在循环链表中设置了一个表头结点,在任何情况下,循环链表中至少有一个结点存在,从而使空表与非空表的运算统一。
循环链表是在单链表的基础上增加了一个表头结点,其插入和删除运算与单链表相同。
但它可以从任一结点出发来访问表中其他所有结点,并实现空表与非空表的运算的统一。
1.6树与二叉树
1、树的基本概念
树是一种简单的非线性结构。
在树这种数据结构中,所有数据元素之间的关系具有明显的层次特性。
在树结构中,每一个结点只有一个前件,称为父结点。
没有前件的结点只有一个,称为树的根结点,简称树的根。
每一个结点可以有多个后件,称为该结点的子结点。
没有后件的结点称为叶子结点。
在树结构中,一个结点所拥有的后件的个数称为该结点的度,所有结点中最大的度称为树的度。
树的最大层次称为树的深度。
2、二叉树及其基本性质
(1)什么是二叉树
二叉树是一种很有用的非线性结构,它具有以下两个特点:
1)非空二叉树只有一个根结点;
2)每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。
根据二叉树的概念可知,二叉树的度可以为0(叶结点)、1(只有一棵子树)或2(有2棵子树)。
(2)二叉树的基本性质
性质1在二叉树的第k层上,最多有个结点。
性质2深度为m的二叉树最多有个个结点。
性质3在任意一棵二叉树中,度数为0的结点(即叶子结点)总比度为2的结点多一个。
性质4具有n个结点的二叉树,其深度至少为,其中表示取的整数部分。
3、满二叉树与完全二叉树
满二叉树:
除最后一层外,每一层上的所有结点都有两个子结点。
完全二叉树:
除最后一层外,每一层上的结点数均达到最大值;
在最后一层上只缺少右边的若干结点。
根据完全二叉树的定义可得出:
度为1的结点的个数为0或1。
下图a表示的是满二叉树,下图b表示的是完全二叉树:
完全二叉树还具有如下两个特性:
性质5具有n个结点的完全二叉树深度为。
性质6设完全二叉树共有n个结点,如果从根结点开始,按层序(每一层从左到右)用自然数1,2,…,n给结点进行编号,则对于编号为k(k=1,2,…,n)的结点有以下结论:
①若k=1,则该结点为根结点,它没有父结点;
若k>
1,则该结点的父结点的编号为INT(k/2)。
②若2k≤n,则编号为k的左子结点编号为2k;
否则该结点无左子结点(显然也没有右子结点)。
③若2k+1≤n,则编号为k的右子结点编号为2k+1;
否则该结点无右子结点。
4、二叉树的存储结构
在计算机中,二叉树通常采用链式存储结构。
与线性链表类似,用于存储二叉树中各元素的存储结点也由两部分组成:
数据域和指针域。
但在二叉树中,由于每一个元素可以有两个后件(即两个子结点),因此,用于存储二叉树的存储结点的指针域有两个:
一个用于指向该结点的左子结点的存储地址,称为左指针域;
另一个用于指向该结点的右子结点的存储地址,称为右指针域。
一般二叉树通常采用链式存储结构,对于满二叉树与完全二叉树来说,可以按层序进行顺序存储。
5、二叉树的遍历
(c)二叉树
二叉树的遍历是指不重复地访问二叉树中的所有结点。
二叉树的遍历可以分为以下三种:
(1)前序遍历(DLR):
若二叉树为空,则结束返回。
否则:
首先访问根结点,然后遍历左子树,最后遍历右子树;
并且,在遍历左右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
图C二叉树前序的遍历结果为:
F,C,A,D,B,E,G,H,P。
(2)中序遍历(LDR):
首先遍历左子树,然后访问根结点,最后遍历右子树;
并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。
图C二叉树中序的遍历结果为:
A,C,B,D,F,E,H,G,P。
(3)后序遍历(LRD):
首先遍历左子树,然后遍历右子树,最后访问根结点,并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。
图C二叉树后序的遍历结果为:
A,B,D,C.H,P,G,E,F。
1.7查找技术
查找:
根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。
查找结果:
(查找成功:
找到;
查找不成功:
没找到。
)
平均查找长度:
查找过程中关键字和给定值比较的平均次数。
1、顺序查找
基本思想:
从表中的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到两者相符,查到所要找的元素为止。
否则就是表中没有要找的元素,查找不成功。
在平均情况下,利用顺序查找法在线性表中查找一个元素,大约要与线性表中一半的元素进行比较,最坏情况下需要比较n次。
顺序查找一个具有n个元素的线性表,其平均复杂度为O(n)。
下列两种情况下只能采用顺序查找:
1)如果线性表是无序表(即表中的元素是无序的),则不管是顺序存储结构还是链式存储结构,都只能用顺序查找。
2)即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。
2、二分法查找
思想:
先确定待查找记录所在的范围,然后逐步缩小范围,直到找到或确认找不到该记录为止。
前提:
必须在具有顺序存储结构的有序表中进行。
查找过程:
1)若中间项(中间项mid=(n-1)/2,mid的值四舍五入取整)的值等于x,则说明已查到;
2)若x小于中间项的值,则在线性表的前半部分查找;
3)若x大于中间项的值,则在线性表的后半部分查找。
特点:
比顺序查找方法效率高。
最坏的情况下,需要比较log2n次。
二分法查找只适用于顺序存储的线性表,且表中元素必须按关键字有序(升序)排列。
对于无序线性表和线性表的链式存储结构只能用顺序查找。
在长度为n的有序线性表中进行二分法查找,其时间复杂度为O(log2n)。
1.8排序技术
排序是指将一个无序序列整理成按值非递减顺序排列的有序序列,即是将无序的记录序列调整为有序记录序列的一种操作。
1、交换类排序法(方法:
冒泡排序,快速排序)。
2、插入类排序法(方法:
简单插入排序,希尔排序)。
3、选择类排序法(方法:
简单选择排序,堆排序)。
总结:
各种排序法比较:
本章应考点拨:
本章内容在笔试中会出现5-6个题目,是公共基础知识部分出题量比较多的一章,所占分值也比较大,约10分。
1.9全真试题训练
一、选择题
(1)下列叙述中正确的是()
A)程序执行的效率与数据的存储结构密切相关
B)程序执行效率只取决于程序的控制结构
C)程序执行的效率只取决于所处理的数据量
D)以上三种说法都不对
(2)下列叙述中正确的是()
A)数据的逻辑结构与存储结构必定是一一对应的
B)由于计算机存储空间是向量式的存储结构,因此,数据的存储结构一定是线性结构
C)程序设计语言中的数组一般是顺序存储结构,因此,利用数组只能处理线性结构
(3)冒泡排序在最坏情况下的比较次数是()
A)n(n+1)/2B)nlog2nC)n(n-1)/2D)n/2
(4)一棵二叉树中共有70个叶子结点与80个度为1的结点,则该二叉树中的总结点数为()
A)219B)2211C)229D)231
(5)下列叙述中正确的是()
A)算法的效率只是与问题的规模有关,而与数据的存储结构无关
B)算法的时间复杂度是指执行算法所需要的计算工作量
C)数据的逻辑结构与存储是一一对应的
D)算法的时间复杂度与空间复杂度一定相关
(6)下列对队例的叙述正确的是()
A)队列属于非线性表B)队列按“先进后出”原则组织数据
C)队列在队尾删除数据D)队列按“先进先出”原则组织数据
(7)对右图二叉树进行前序遍历的结果为()
A)DYBEAFCZXB)YDEBFZXCA
C)ABDYECFXZD)ABCDEFXYZ
(8)某二叉树中有n个度为2的结点,则该二叉树中的叶子结点数为()
A)n+1B)n-1C)2nD)n/2
(9)下列叙述中正确的是()
A)一个算法的空间复杂度大,则其时间复杂度也必定大
B)一个算法的空间复杂度大,则其时间复杂度必定小
C)一个算法的时间复杂度大,则其空间复杂度必定小
D)上述三种说法都不对
(10)在长度为64的有序线性表中进行顺序查找,最坏情况下需要比较的次数为()
A)63B)64C)6D)7
(11)下列叙述中正确的是()
A)线性链表层是线性表的链式存储结构
B)栈与队列是非线性结构
C)双向链表是非线性结构
D)只有根结点的二叉树是线性结构
(12)对右图二叉树进行后序遍历的结果为()
A)ABCDEFB)DBEAFCC)ABDECFD)DEBFCA
(13)在深度为7的满二叉树中,叶子结点的个数为()
A)32B)31C)64D)63
(14)下列数据结构中,能用二分法进行查找的是()
A)顺序存储的有序线性表B)线性链表
C)二叉链表D)有序线性链表
(15)下列关于栈的描述正确的是()
A)在栈中只能插入元素而不能删除元素
B)在栈中只能删除元素而不能插入元素
C)栈是特殊的线性表,只能在一端插入或删除元素
D)栈是特殊的线性表,只能在一端插入元素,而在另一端删除元素
二、填空题
(1)按“先进后出”原则组织数据的数据结构是[1]。
(2)数据结构分为线性结构和非线性结构,带链的队列属于[2]。
(3)对长度为10的线性表进行冒泡排序,最坏情况下需要比较的次数为(3)。
(4)算法复杂度主要包括时间复杂度和[4]复杂度。
(5)一棵二叉树第六层(根结点为第一层)的结点数最多为[5]个。
(6)数据结构分为逻辑结构和存储结构,循环队列属于[6]结构。
(7)某二叉树中度为2的结点有18个,则该二叉树中有[7]个叶子结点。
1.9.1全真试题参考答案
一、选择题
(1)A[分析]程序的执行效率与算法和数据结构有密切的关系,瑞士科学家沃士说过“程序=算法+数据结构”。
所以程序执行的效率与数据的存储结构密切相关;
程序执行的效率与程序的控制结构、所处理的数据量有关,但不绝对相关。
因此本题的正确答案是A。
(2)D[分析]数据的逻辑结构与存储结构是一对多关系,一般来说,一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接、索引等;
计算机存储空间是向量式的存储结构,但数据的存储结构可以是线性结构(顺序结构),也可以是非线性结构(链式结构),现在计算机的存储结构往往是非线性(链式)的;
利用数组既可以处理线性结构,也可以处理非线性结构,比如二叉树,可以使用数组来保存,可以使用数组来解决二叉树中数据处理的问题。
因此本题的正确答案是D
(3)C[分析]对于长度为N的线性表,在最坏情况下,冒泡排序需要进行的比较次数是N(N-1)/2。
因此本题的正确答案是C
(4)A[分析]二叉树具有这样一个性质:
在任意一颗二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。
本题告知,叶子结点有70个,那度为2的结点就有69个,度为1的结点有80个,这颗二叉树共有70+69+80=219个结点。
(5)B[分析]算法的效率不仅与问题的规模有关,而且与数据的存储结构有关;
算法的时间复杂度是指执行算法所需要的计算工作量;
一般来说一种数据的逻辑结构根据需要可以表示成多种存储结构;
算法的时间复杂度与空间复杂度没有必然的联系。
因此本题正确答案为B。
(6)D[分析]队列是按“先进先出”原则组织数据的线性表。
对队列实施的操作有:
入队和出队,入队只能在队列的队尾进行,出队只能在队列的队头进行。
因此本题的正确答案是D。
(7)C[分析]前序遍历(DLR)的基本思想是:
先访问根结点,后前序遍历左子树,再前序遍历右子树。
本题根结点是A,前序遍历左子树得到的序列为BDYE,前序遍历右子树得到的序列是CFXZ,所以本题二叉树前序遍历的结果为ABDYECFXZ。
因此本题的正确答案是C。
(8)A[分析]二叉树具有这样一个性质:
所以某二叉树有N个度为2的结点,则该二叉树中的叶子结点数为N+1。
(9)D[分析]一个算法的好坏一般用时间复杂度与空间复杂度这两个指标来衡量。
一般一个算法的时间复杂度和空间复杂度越小,这个算法就越好。
若某算法用时最少,占用空间最小,我们就称此算法为最佳算法。
比如二分查找算法在数学上就可以证明是最佳查找算法。
一个算法的时间复杂度和空间复杂度之间没有必然的联系,也就是说一个算法的时间复杂度小,它的空间复杂度不一定也小,反之依然。
(10)B[分析]只要是顺序查找都是从表头到表尾逐个比较,若相同则结束查找,否则一直比较下一个表中元素,直到整个表都遍历完。
对于长度为64的线性表,平均要进行64/2=32次比较,在最坏情况下要进行64次比较,若采用二分查找,则最坏情况下需要比较的次数为log264=6次,但要注意采用二分查找的条件,必须是线性表采用顺序存储结构,而且线性表中的元素要有序,这两个条件缺一不可,若对线性链表进行查找,则不管线性链表中的元素是有序还是无序只能采用顺序查找。
(11)A[分析]线性表的链式存储结构称为线性链表,栈、队列、双向链表都是线性结构;
树、二叉树都是非线性结构。
(12)D[分析]后序遍历的方法是:
否则先后序遍历左子树,再后序遍历右子树,最后访问根结点。
本题后序遍历左子树的结果是DEB,后序遍历右子树的结果是FC,最后根是A,所以后序遍历的结果是DEBFCA,因此本题正确答案是D。
(13)C[分析]在满二叉树中每层的结点数都达到最大值,而且叶子结点全部出现在最底层,第一层有20个结点,第2层有21个结点,……第N层有2N-1个结点。
在深度为7的满二叉树中,第7层有27-1个结点。
在深度为7的满二叉树中,共有27-1个结点,因此本题正确答案为C。
(14)A[分析]二分法又叫折半查找法,只适合于顺序存储的有序表。
二分法的基本思想是:
设有序线性表的长度为N,被查元素为X,则二分查找的方法如下:
将X与线性表