收藏 分享(赏)

(2012-9)等级考试公共基础考点(修订整理稿).doc

上传人:dzzj200808 文档编号:2321002 上传时间:2018-09-10 格式:DOC 页数:55 大小:1.12MB
下载 相关 举报
(2012-9)等级考试公共基础考点(修订整理稿).doc_第1页
第1页 / 共55页
(2012-9)等级考试公共基础考点(修订整理稿).doc_第2页
第2页 / 共55页
(2012-9)等级考试公共基础考点(修订整理稿).doc_第3页
第3页 / 共55页
(2012-9)等级考试公共基础考点(修订整理稿).doc_第4页
第4页 / 共55页
(2012-9)等级考试公共基础考点(修订整理稿).doc_第5页
第5页 / 共55页
点击查看更多>>
资源描述

1、全国计算机等级考试二级公共基础知识指导 考试内容 一、基本数据结构与算法1. 算法的基本概念;算法复杂度的概念和意义(时间复杂度与空间复杂度) 。2. 数据结构的定义;数据的逻辑结构与存储结构;数据结构的图形表示;线性结构与非线性结构的概念。3. 线性表的定义;线性表的顺序存储结构及其插入与删除运算。4. 栈和队列的定义;栈和队列的顺序存储结构及其基本运算。5. 线性单链表、双向链表与循环链表的结构及其基本运算。6. 树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。7. 顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序) 。 二、程序设计基础1.

2、 程序设计方法与风格。2. 结构化程序设计。3. 面向对象的程序设计方法,对象,方法,属性及继承与多态性。 三、软件工 程基础1. 软件工程基本概念,软件生命周戎概念,软件工具与软件开发环境。2. 结构化分析方法,数据流图,数据字典,软件需求规格说明书。3. 结构化设计方法,总体设计与详细设计。4. 软件测试的方法,白盒测试与黑盒测试,测试用例设计,软件测试的实施,单元测试、集成测试和系统测试。5. 程序的调试,静态调试与动态调试。 四、数据库设计基础1. 数据库的基本概念:数据库,数据库管理系统,数据库系统。2. 数据模型,实体联系模型及 E-R图,从 E-R图导出关系数据模型。3. 关系代

3、数运算,包括集合运算及选择、投影、连接运算,数据库规范化理论。4. 数据库设计方法和步骤:需求分析、概念设计、逻辑设计和物理设计的相关策略。 考试方式1 、公共基础的考试方式为笔试,与 C语言(VisualBASIC、VisualFoxPro、Java、Access、VisualC+)的笔试部分合为一张试卷。公共基础部分占全卷的 30分。2 、公共基础知识有 10道选择题和 5道填空题。等级考试公共基础考点分析之数据结构与算法1.1算法考点 1算法的基本概念计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法。算法(algorithm)是一组严谨地定义运算顺序的规则,并且每一个规则都

4、是有效的,同时是明确的;此顺序将在有限的次数后终止。算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。1 算法的基本特征(1)可行性(effectiveness) :针对实际问题而设计的算法,执行后能够得到满意的结果。(2)确定性(definiteness):算法中的每一个步骤都必须有明确的定义,不允许有模棱两可的解释和多义性。(3)有穷性(finiteness):算法必需在有限时间内做完,即算法必需能在执行有限个步骤之后终止。(4)拥有足够的情报:要使算法有效必需为算法提供足够的情报当算法拥有足够的情报时,此算法才最有效的;而当提供的情报不够时,算法可

5、能无效。2 算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。基本运算和操作包括:算术运算:主要包括加、减、乘、除等运算;逻辑运算:主要包括“与”、 “或” 、 “非”等运算;关系运算:主要包括“大于”、 “小于” 、 “等于”、 “不等于” 等运算;数据传输:主要包括赋值、输入、输出等操作。算法的控制结构:不仅决定了算法中各操作的执行顺序,而且也直接反映了算法的设计是否符合结构化原则。描述算法的工具通常有传统流程图、N-S 结构化流程图、算法描述语言等。一个算法一般都可以用顺序、选择、循环 3 种基本控制结构组合而成。3 算法设计的基本方法:列举法、归纳法、递推、递归、减半递推

6、技术、回溯法。4.算法设计的要求:正确性、可读性、健壮性、效率与低存储量需求考点 2算法的复杂度1算法的时间复杂度算法的时间复杂度,是指执行算法所需要的计算工作量。一个特定算法“运行工作量”的大小,只依赖于问题的规模(通常用整数 n表示),它是问题的规模函数。即算法的工作量=f(n) 例如,在 NN矩阵相乘的算法中,整个算法的执行时间与该基本操作(乘法)重复执行的次数 n3成正比,也就是时间复杂度为 n3,即 f(n)=O(n3)(1)平均性态(AverageBehavior)所谓平均性态是指各种特定输入下的基本运算次数的加权平均值来度量算法的工作量。(2)最坏情况复杂性(Worst-case

7、Complexity)所谓最坏情况分析,是指在规模为 n时,算法所执行的基本运算的最大次数。2算法的空间复杂度算法的空间复杂度是指执行这个算法所需要的内存空间。1.2数据结构的基本概念考点 3数据结构的定义数据结构(datastructure) 是指反映数据元素之间的关系的数据元素集合的表示。更通俗地说,数据结构是指带有结构的数据元素的集合。所谓结构实际上就是指数据元素之间的前后件关系。一个数据结构应包含以下两方面信息:(1)表示数据元素的信息;(2)表示各数据元素之间的前后件关系。是指相互之间存在一种或多种特定关系的数据元素的集合,即数据的组织形式。数据结构研究的三个方面:(1)数据集合中和

8、数元素之间所固有的逻辑关系,即数据的逻辑结构;(2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构;(3)对各种数据结构进行的运算。1 数据的逻辑结构数据的逻辑结构是对数据元素之间的逻辑关系的描述,它可以用一个数据元素的集合 D 和定义在此集合中的若干关系 R 来表示。B=(D,R)一年四季的数据结构: D=春,夏,秋,冬, R=(春,夏),(夏,秋 ),(秋,冬)数据的逻辑结构包括集合、线性结构、树型结构和图形结构四种。2 数据的存储结构数据的逻辑结构在计算机存储空间中的存放形式,称为数据的存储结构(也称数据的物理结构)。由于数据元素在计算机存储空间中的位置关系可能与逻

9、辑关系不同,因此,为了表示存放在计算机存储空间中的各数据元素之间的逻辑关系(即前后件关系) ,在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各数据元素之间的前后件关系的信息。一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接、索引等存储结构而采用不同的存储结构,其数据处理的效率是不同的。因此,在进行数据处理时,选择合适的存储结构是很重要的。考点 4数据结构的图形表示数据结构除了用二元关系表示外,还可以直观地用图形表示。在数据结构的图形表示中,对于数据集合 D中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,并简称为结点;为了进一步表示各数据

10、元素之间的前后件关系,对于关系 R中的每一个二元组,用一条有向线段从前件结点指向后件结点。在数据结构中,没有前件的结点称为根结点;没有后件的结点称为终端结点(也称为叶子结点)。一个数据结构中的结点可能是在动态变化的。根据需要或在处理过程中,可以在一个数据父亲儿子 女儿春 夏 秋 冬( a ) 一年四季数据结构 ( b ) 家庭关系数据结构结构中增加一个新结点(称为插入运算),也可以删除数据结构中的某个结点(称为删除运算)。插入与删除是对数据结构的两种基本运算。除此之外,对数据结构的运算还有查找、分类、合并、分解、复制和修改等。考点 5线性结构与非线性结构如果在一个数据结构中一个数据元素都没有,

11、则称该数据结构为空的数据结构。根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。非空数据结构满足:(l)有且只有一个根结点;(2)每一个结点最多有一个前件,也最多有一个后件。则称该数据结构为线性结构。线性结构又称为线性表。一个线性表是 n个数据元素的有限序列。如果一个数据结构不是线性结构,称之为非线性结构。常见的线性结构有:线性表、栈与队列、线性链表常见的非线性结构有:树、二叉树、图1.3线性表及顺序存储结构考点 6线性表的定义线性表是 n(n0)个元素构成的有限序列(a1,a2,an)。在复杂的线性表中,由若干数据项组成的数据元素称为记录(r

12、ecord),而由多个记录构成的线性表又称为文件(file)。在非空表中的每个数据元素都有一个确定的位置,如 a1是第一个元素,an 是最后一个数据元素,ai 是第 i个数据元素,称 i为数据元素 ai在线性表中的位序。非空线性表有如下一些结构特征:(1)有且只有一个根结点 a1,它无前件;(2)有且只有一个终端结点 an,它无后件;(3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。线性表中结点的个数 n称为线性表的长度。当 n=0时称为空表。考点 7线性表的顺序存储结构线性表的顺序储结构具有以下两个基本特点:(1)线性表中所有元素的所占的存储空间是连续的;(2)线

13、性表中各数元素在存储空间中是按逻辑顺序依次存放的。ai 的存储地址为:ADR(ai)=ADR(a1)+(i-1)k,ADR(a1)为第一个元素的地址,k 代表每个元素占的字节数。顺序表的运算:插入、删除。考点 8顺序表的插入运算线性表的插入运算是指在表的第 i(1in+l)个位置上,插入一个新结点 x,使长度为 n的线性表(a1,ai-1,ai,an)变成长度为 n+1的线性表(a1,ai-1,x,ai,an)现在分析算法的复杂度。这里的问题规模是表的长度,设它的值为 n。该算法的时间主要花费在循环结点后移语句上,该语句的执行次数(即移动结点的次数)是 n-i+1。由此可看出,所需移动结点的次

14、数不仅依赖于表的长度,而且还与插入位置有关。当 i=n+1时,由于循环变量的终值大于初值,结点后移语句将不进行;这是最好情况,其时间复杂度 O(1);当 i=1时,结点后移语句,将循环执行 n次,需移动表中所有结点,这是最坏情况,其时间复杂度为 O(n)。不失一般性,假设在表中任何位置(1in+1)上插入结点的机会是均等的,则 p1=p2=p3=pn+1=1/(n+1)因此,在等概率插入的情况下,也就是说,在顺序表上做插入运算,平均要移动表上一半的结点。当表长 n较大时,算法的效率相当低。虽然 Eis(n)中 n的的系数较小,但就数量级而言,它仍然是线性级的。因此算法的平均时间复杂度为 O(n

15、)。考点 9顺序表的删除运算线性表的删除运算是指将表的第 i(1in)个结点删除,使长度为 n的线性表:(a1,ai-1,ai,ai+1,an)变成长度为 n-l的线性表(a1,ai-1,ai+1,an)该算法的时间分析与插入算法相似,结点的移动次数也是由表长 n和位置 i决定。若i=n,则由于循环变量的初值大于终值,前移语句将不执行,无需移动结点;若 i=1,则前移语句将循环执行 n一 1次,需移动表中除开始结点外的所有结点。这两种情况下算法的时间复杂度分别为 O(1)和 O(n)。删除算法的平均性能分析与插入算法相似。在长度为 n的线性表中删除一个结点,令Ede(n)表示所需移动结点的平均

16、次数,删除表中第 i个结点的移动次数为 n-i,故 pi表示删除表中第 i个结点的概率。在等概率的假设下,p1=p2=p3=pn=1/n由此可得: 即在顺序表上做删除运算,平均要移动表中约一半的结点,平均时间复杂度也是 O(n)。1.4栈和队列考点 10栈及其基本运算12)(iisipEnidl ipE121)(1什么是栈栈实际也是线性表,只不过是一种特殊的线性表。栈(Stack)是只能在表的一端进行插入和删除运算配线性表,通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom)。当表中没有元素时称为空栈(栈顶元素总是后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插

17、入的元素,从而也是最后才能被删除的元素。假设栈 S=(al,a2,a3,an),则 a1,称为栈底元素,an 为栈顶元素。栈中元素按a1,a2,a3,an 的次序进栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。因此,栈称为先进后出表(FILO,FirstInLastOut),或“后进先出”表(LIFO,LastInFirstOut),如图 1-7所示。图 1-7进栈出栈示意图2栈的顺序存储及其运算(l)入栈运算:入栈运算是指在栈顶位置插入一个新元素。首先将栈顶指针加一(即 top加1),然后将元素插入到栈顶指针指向的位置。当栈顶指针已经指向存储空间的最后一个位置

18、时,说明栈空间已满,不可能再进行入栈操作。这种情况称为栈“上溢”错误。如图 1-8所示。(2)退栈运算:退栈是指取出栈顶元素并赋给一个指定的变量。首先将栈顶元素(栈顶指针指向的元素)赋给一个指定的变量,然后将栈顶指针减一(即 t叩减 1)。当栈顶指针为。时,说明栈空,不可进行退栈操作。这种情况称为栈的“下溢”错误。(3)读栈顶元素:读栈顶元素是指将栈顶元素赋给一个指定的变量。这个运算不删除栈顶元素,只是将它赋给一个变量,因此栈顶指针不会改变。当栈顶指针为 0时,说明栈空,读不到栈顶元素。考点 11队列及其基本运算1什么是队列队列(queue)是只允许在一端删除,在另一端插入的顺序表,允许删除的

19、一端叫做队头(front),允许插入的一端叫做队尾(rear),如图 1-9所示。a 1a 2a n栈顶 t o p栈底 b o t t o m入栈 出栈A B C D E F队 头f r o n t 队尾r e a r退队 入队当队列中没有元素时称为空队列。在空队列中依次加入元素 a1,a2,an 之后,a1 是队头元素,an 是队尾元素。显然退出队列的次序也只能是 a1,a2,an 也就是说队列的修改是依先进先出的原则进行的。因此队列亦称作先进先出(FIFO,FirstInFirstOut)的线性表,或后进后出(LILO,LastInLastOut)的线性表。往队列队尾插入一个元素称为入队

20、运算,从队列的排头删除一个元素称为退队运算,如图 1-10所示。一个队列币。删除个儿素后的队列间插入元素 E后的队列图 1-10队列运算示意图2循环队列及其运算在实际应用中,队列的顺序存储结构一般采用循环队列的形式。所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,如图 1-11所示。1.5线性链表考点 12线性单链表的结构及其基本运算1什么是线性链表(l)线性表顺序存储的缺点在一般情况下,要在顺序存储的线性表中插入一个新元素或删除一个元素时,为了保证插入或删除后的线性表仍然为顺序存储,则在插入或删除过程中需要移动大量的数据元素。因此采用顺序存储结构进行插入或

21、删除的运算效率很低;当为一个线性表分配顺序存储空间后,如果出现线性表的存储空间已满,但还需要插入新的元素时栈会发生“上溢”错误;计算机空间得不到充分利用,并且不便于对存储空间的动态分配。(2)线性表链式的基本概念在定义的链表中,若只含有一个指针域来存放下一个元素地址,称这样的链表为单链表或线性链表。在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。其中指针用于指向该结点的前一个或后一个结点(即前件或后件)。如图 1-13所示。2线性单链表的存储结构用一组任意的存储单元来依次存放线性表的结点,这组存储单元既可以是连续的,也可以是不

22、连续的,甚至是零散分布在内存中的任意位置上的。因此,链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后件结点的地址(或位置)信息,这个信息称为指针(pointer)或链(link)。这两部分组成了链表中的结点结构,如图 1-14所示。图 1-14线性表的逻辑结构链表正是通过每个结点的链域将线性表的 n个结点按其逻辑次序链接在一起。由于上述链表的每一个结点只有一个链域,故将这种链表称为单链表(SingleLinked)。显然,单链表中每个结点的存储地址是存放在其前驱结点 Next域中,而开始结点无前驱,故应设头指针 HEAD指向开

23、始结点。同时,由于终端结点无后件,故终端结点的指针域为空,即 NULL。3带链的栈与队列(1)栈也是线性表,也可以采用链式存储结构。在实际应用中,带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,这种带链的栈称为可利用栈,如图 1-15所示。图 1-15带链的栈(2)队列也是线性表,也可以采用链式存储结构,如图 1-16所示。图 1-16带链的队列考点 13线性链表的基本运算dat next数 据 域 指 针 域 a1 a2 an-1HEAD an(a)结 点 结 构 (b)一 个 非 空 的 线 性 链 表 示 意 图1在线性链表中查找指定元素在对线性链表进行插入或删除的运算中,总是首

24、先需要找到插入或删除的位置,这就需要对线性链表进行扫描查找,在线性链表中寻找包含指定元素的前一个结点。在线性链表中,即使知道被访问结点的序号 a,也不能像顺序表中那样直接按序号 i访问结点,而只能从链表的头指针出发,顺链域 Next逐个结点往下搜索,直到搜索到第 i个结点为止。因此,链表不是随机存取结构。在链表中,查找是否有结点值等于给定值 x的结点,若有的话,则返回首次找到的其值为x的结点的存储位置;否则返回 NULL。查找过程从开始结点出发,顺着链表逐个将结点的值和给定值 x作比较。2线性链表的插入线性链表的插入是指在链式存储结构下的线性链表中插入一个新元素。插入运算是将值为 X的新结点插

25、入到表的第 i个结点的位置上,即插入到 ai-1,与 ai之间。因此,我们必须首先找到 ai-1的存储位置 p,然后生成一个数据域为 x的新结点*p,并令结点,p 的指针域指向新结点,新结点的指针域指向结点 ai。如图 1-17所示。图 1-17线性表的插入示意图由线性链表的插入过程可以看出,由于插入的新结点取自于可利用栈,因此,只要可利用栈不空,在线性链表插入时总能取到存储插入元素的新结点,不会发生“上溢”的情况。而且,由于可利用栈是公用的,多个线性链表可以共享它,从而很方便地实现了存储空间的动态分配。另外,线性链表在插入过程中不发生数据元素移动的现象,只要改变有关结点的指针即可,从而提高了

26、插入的效率。3多线性链表的删除线性链表的删除是指在链式存储结构下的线性链表中删除包含指定元素的结点。删除运算是将表的第 i个结点删去。因为在单链表中结点 a的存储地址是在其直接前趋结点 ai-1,的指针域 Next中,所以我们必须首先找到 ai-1的存储位置 p。然后令 p-Next指向 ai的直接后件结点,即把 ai从链上摘下。最后释放结点 a的空间。如图 1-18所示。图 1-18线性表的删除示意图从线性链表的删除过程可以看出,从线性链表中删除一个元素后,不需要移动表中的数据元素,只要改变被删除元素所在结点的前一个结点的指针域即可。另外,由于可利用栈是用于收集计算机中所有的空闲结点,因此,

27、当从线性链表中删除一个元素后,该元素的存储结点就变为空闲,应将空闲结点送回到可利用栈。考点 14线性双向链表的结构及其基本运算1什么是双向链表在单链表中,从某个结点出发可以直接找到它的直接后件,时间复杂度为 O(1),但无法直接找到它的互接前件;在单循环链表中,从某个结点出发可以直接找到它的直接后件,时间复杂度仍为 O(1),直接找到它的直接前件,时间复杂度为 O(n)。有时,希望能快速找到一个结点的直接前件,这时,可以在单链表中的结点中增加一个指针域指向它的直接前件,这样的链表,就称为双向链表(一个结点中含有两个指针)。如果每条链构成一个循环链表,则会得到双向循环链表,如图 1-19所示。2

28、双向链表的基本运算(l)插入:在 HEAD为头指针的双向链表中,在值为 Y的结点之后插入值为 X的结点,插入结点的指针变化。如图 1-20所示(若改为在值为 Y的结点之前插入值为 X的结点,可以做类似分析)。图 1-20双向链表的插入(2)删除:在以 HEAD为头指针的双向链表中删除值为 X的结点,删除算法的指针变化,如图 1-21所示。图 1-21双向链表的删除考点 15循环链表的结构及其基本运算单链表上的访问是一种顺序访问,从其中的某一个结点出发,可以找到它的直接后件,但无法找到它的直接前件。在前面所讨论的线性链表中,其插入与删除的运算虽然比较方便,但还存在一个问题,在运算过程中对于空表和

29、对第一个结点的处理必须单独考虑,使空表与非空表的运算不统一。因此,我们可以考虑建立这样的链表,具有单链表的特征,但又不需要增加额外的存贮空右 指 针左 指 针 数 据 域(a)结 点 结 构 a1 ana2 HEAD (b)一 个 非 空 的 双 向 链 表 示 意 图间,仅对表的链接方式稍做改变,使得对表的处理更加方便灵活。从单链表可知,最后一个结点的指针域为 NULL,表示单链表已经结束。如果将单链表最后一个结点的指针域改为存放链表中头结点(或第一个结点)的地址,就使得整个链表构成一个环,又没有增加额外的存储空间如图 1-22所示。1.6树与二叉树考点 16树的定义树是由 n(n0)个结点

30、组成的有限集合。若 n=0,称为空树;若 n0,则:(1)有一个特定的称为根(root)的结点。它只有直接后件,但没有直接前件;(2)除根结点以外的其他结点可以划分为 m(m0)个互不相交的有限集合 T0,T1,Tm-1,每个集合 Ti(i=0,1,m-l)又是一棵树,称为根的子树,每棵子树的根结点有且仅有一个直接前件,但可以有 0个或多个直接后件。如图 1-23所示。图 1-23树的结构示意图树型结构具有如下特点:(1)助每个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点,简称为树的根;(2)每一个结点可以有多个后件,它们都称为该结点的子结点。没有后件的结点称为叶子结点

31、;(3)一个结点所拥有的后件个数称为树的结点度;(4)树的最大层次称为树的深度。在计算机中,可以用树结构来表示算术表达式,用树来表示算术表达式的原则是:(1)表达式中的每一个运算符在树中对应一个结点,称为运算符结点;(2)运算符的每一个运算对象在树中为该运算符结点的子树(在树中的顺序为从左到右);(3)运算对象中的单变量均为叶子结点。树在计算机中通常用多重链表表示。考点 17二叉树的定义及其基本性质1什么是二叉树二叉树(binarytree)是由 n(0)个结点的有限集合构成,此集合或者为空集,或者由一个根结点及两棵互不相交的左右子树组成,并且左右子树都是二叉树。二叉树可以是空集合,根可以有空

32、的左子树或空的右子树。二叉树不是树的特殊情况,它们是两个概念。二叉树具有如下两个特点:(1)非空二叉树只有一个根结点;(2)每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。二叉树的每个结点最多有两个孩子,或者说,在二叉树中,不存在度大于 2的结点,并且二叉树是有序树(树为无序树),其子树的顺序不能颠倒,因此,二叉树有 5种不同的形态,如图 1-24所示。图 1-24二叉树的 5种不同形态在二叉树中,一个结点可以只有左子树而没有右子树,也可以只有右子树而没有左子树。当一个结点既没有左子树也没有右子树时,该结点即是叶子结点)2二叉树的基本性质性质 1:在二叉树的第 k层上至多有 2k-

33、1个结点(k1)。性质 2:深度为 m的二叉树至多有 2m-1 个结点。性质 3:对任何一棵二叉树,度为 0的结点(即叶子结点)总是比度为 2的结点多一个。如果叶子结点 n0,度为 2的结点数为 n2,则 n0=n2+l。性质 4:具有 n个结点的完全二叉树的深度至少为log2n+1,其中log2n表示 log2n的整数部分。3满二叉树与完全二叉树(l)满二叉树满二叉树是指这样的一种二叉树:除最后一层外,每一层上的所有结点都有两个子结点。深度为 k的二叉树具有 2k-1个结点。即在满二叉树的第 k层上有 2k-1个结点。从上面满二叉树定义可知,必须是二叉树的每一层上的结点数都达到最大,否则就不

34、是满二叉树。深度为 m的满二叉树有 2m-1个结点。(2)完全二叉树完全二叉树是指这样的二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。如果一棵具有 n个结点的深度为 k的二叉树,它的每一个结点都与深度为 k的满二叉树中编号为 1n的结点一一对应。如图 1-25所示,为满二叉树和完全二叉树的结构比较。图 1-25满二叉树与完全二叉树结构从完全二叉树定义可知,结点的排列顺序遵循从上到下、从左到右的规律。所谓从上到下,表示本层结点数达到最大后,才能放入下一层。从左到右,表示同一层结点必须按从左到右排列,若左边空一个位置时不能将结点放入右边。完全二叉树除最后一层

35、外每一层的结点数都达到最大值,最后一层只缺少右边的若干结点。满二叉树也是完全二叉树,反之完全二叉树不一定是满二叉树。性质 5:具有 n个结点的完全二叉树深度为log2n+1 或log2(n+1)。性质 6:如果对一棵有 n个结点的完全二叉树的结点按层序编号(从第 1层到第log2n+1层,每层从左到右),则对任一结点 i(1in),有:(1)如果 i=1,则结点 i无双亲,是二叉树的根;如果 i1,则其双亲是结点i/2;(2)如果 2in,则结点 i为叶子结点,无左孩子;否则,其左孩子是结点 2i;(3)如果 2i+1n,则结点 i无右孩子;否则,其右孩子是结点 2i+1。4二叉树的存储结构在

36、计算机中,二叉树通常采用链式存储结构。用于存储二叉树中各元素的存储结点由两部分组成:数据域与指针域。但在二叉树中,由于每一个元素可以有两个后件(两个子结点),因此,用于存储二叉树的存储结点的指针域有两个:一个用于指向该结点的左子结点的存储地址,称为左指针域;另一个用于指向该结点的右子结点的存储地址,称为右指针域。如图 1-26所示。图 1-26二叉树的存储结构考点 18二叉树的遍历所谓遍历二叉树,就是遵从某种次序,访问二叉树中的所有结点,使得每个结点仅被访问一次。(1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树;(2)中序遍历(LDR),首先遍历左子树,然后访问根结点,

37、最后遍历右子树;(3)后序遍历(LRD),首先遍历左子树,然后访问遍历右子树,最后访问根结点。 前序遍历: A、B、D、G、C、E、F 中序遍历:AB CDGEF9871 1 1 2 1 3 1 43 5 61 2041 09873 5 61 204( a ) 满二叉树 ( b ) 完全二叉树 D、G、B、A、E、C、F 后序遍历: G、D、B、E、F、C、A 1.7查找技术考点 19顺序查找与二分查找算法1顺序查找顺序查找是一种最简单的查找方法,它的基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描为结点关键字和待找的值 k相比较,若相等,则查找成功;若整个表扫描完毕,仍未找到关键字等于

38、 K的元素、则查找失败。当 n较大时,不宜采用顺序查找,而必须寻求更好的查找方法。但在下列两种情况下只能采用顺序查找:(1)如果线性表是无序表(即表中的元素是无序的),则不管是顺序存储结构还是链式存储结构,都只能用顺序查找。(2)即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。2二分查找二分查找,也称折半查找,它是一种高效率的查找方法。但二分查找有条件限制:要求表必须用顺序存储结构,且表中元素必须按关键字有序(升序或降序均可)排列。对于长度为 n的有序线性表,最坏情况只需比较 log2n次。设有序线性表长度为 n,被查找元素为 x,则二分查找的方法如下:将 x与线性表的中间项比较:(

39、1)若 x的值与中间项的值相等,则说明查到,查找结束;(2)若 x小于中间项的值,则在线性表的前半部分以相同的方法查找;(3)若 x大于中间项的值,则在线性表的后半部分以相同的方法查找。若查找进行到子表长度为 0,说明线性表中没有这个元素。假设给定有序表中关键字为 8,17,25,44,68,77,98,100,115,125,将查找 k=17的情况描述为如图 1-27所示。图 1-27二分查找情况示意图1.8排序技术考点 20交换类排序法排序是指将一个无序序列整理成按值的有序表,对于长度为 n的有序线性表,最坏情况只需比较 n次。等级考试公共基础考点分析之程序设计基础2.1程序设计方法与风格

40、考点 1程序设计经历的阶段程序设计是一门技术,需要相应的理论、技术、方法和工具来支持,程序设计主要经历了结构化设计和面向对象的程序设计阶段。考点 2良好的编程风格应注意的因素1源程序的文档化(1)符号名的命名规则:符号名的命名应具有一定的实际含义,以便理解程序功能。(2)正确的程序注释:注释一般为序言性注释和功能性注释。(3)视觉组织:在程序中利用空格、空行、缩进等技巧使程序层次清晰。2数据说明的方法(1)数据说明的次序规范化;(2)说明语句中变量安排有序化;(3)使用注释来说明复杂数据的结构。3语句的结构为使程序更简单易懂,语句构造应该简单直接,应注意如下:(l)在一行内只写一条语句;(2)

41、程序编写应优先考虑清晰性;(3)程序编写要做到清晰第一,效率第二;(4)在保证程序正确的基础上再要求提高效率;(5)避免使用临时变量而使程序的可读性下降;(6)避免不必要的转移;(7)尽量使用库函数;(8)避免采用复杂的条件语句;(9)尽量减少使用“否定”条件语句;(10)数据结构要有利于程序的简化;(11)要模块化,使模块功能尽可能单一化;(12)利用信息隐蔽,确保每一个模块的独立性;(13)从数据出发去构造程序;(14)不要修补不好的程序,要重新编写。4输入输出输入输出方式和风格应尽可能方便用户的使用,应考虑如下原则:(l)对输入数据要检验数据的合法性;(2)检查输入项的各种重要组合的合理

42、性;(3)输入格式要简单,使得输入的步骤和操作尽可能简单;(4)输入数据时,应允许使用自由格式;(5)应允许缺省值;(6)输入一批数据时,最好使用输入结束标志;(7)在以交互式输入/输出方式进行输入时,要在屏幕上使用提示符明确提示输入的请求,同时在数据输入过程中和输入结束时,应在屏幕上给出状态信息;(8)当程序设计语言对输入格式有严格要求时,应保持输入格式与输入语句的一致性。2.2结构化程序设计考点 3结构化程序设计的原则一个结构化程序就是用高级语言表示的结构化算法,这种程序便于编写、阅读、修改和维护,这就减少了程序出错的机会,提高了程序的可靠性,保证了程序的质量。结构化程序设计强调程序设计风

43、格和程序结构的规范化,结构清晰第一、效率第二。如图 2-1所示,结构化程序设计采取如下方法:图 2-l自顶而下、逐步求精方法示意图(1)自顶向下:即先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。这种程序结构按功能划分为若干个基本模块,这些模块形成一个树状结构;(2)逐步求精:对复杂问题,应设计一些子目标做过渡,逐步细化。(3)模块化:模块化是把程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,把每个小目标称为一个模块;(4)限制使用 GOTO语句。考点 4结构化程序的基本结构与特点1966年 Boehm和 Jacopini证明了程序设计语言仅仅使用顺序、选择和重复三种基本控

44、制结构就足以表达出各种其他形式结构的程序设计方法考点 5结构化程序设计原则和方法的应用结构化程序设计中,要注意把握如下要素:(1)使用程序设计语言中的顺序、选择、循环等有限的控制结构表示程序的控制逻辑;(2)选用的控制结构只准许有一个入口和一个出口;(3)程序语言组成容易识别的块,每块只有一个入口和一个出口;(4)复杂结构应该用嵌套的基本控制结构进行组合嵌套来实现;(5)语言中所没有的控制结构,应该采用前后一致的方法来模拟;(6)尽量避免 GOTO语句的使用。虽然结构化程序设计方法具有很多优点,但它仍是一种面向过程的程序设计方法。它把数据和处理数据的过程分离为相互独立的实体,当数据结构改变时,

45、所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差一个好的软件应该随时响应用户的任何操作,而不是请用户按照既定的步骤循规蹈矩地使用,因此对这种软件的功能很难用过程来描述和实现,如果仍用面向过程的方法,开发和维护都将很困难。2.3面向对象的程序设计考点 6面向对象的方法客观世界中任何一个事物都可以被看成是一个对象,系统中的对象以及对象之间的关系能够如实地反映问题域中固有事物及其关系。从计算机的角度来看,一个对象应该包括两个要素:一是数据;二是需要进行的操作。对象就是一个包含数据以及与这些数据有关的操作的集合,如图 2-5所示。面向对象就是运用对象

46、、类、继承、封装、消息、结构与连接等面向对象的概念对问题进行分析、求解的系统开发技术。图 2-5对象的组成面向对象有如下主要优点:(1)与人类习惯的思维方法一致传统的程序设计方法是面向过程的,忽略了数据和操作之间的内在联系,用这种方法设计出来的软件系统的空间与问题空间不一致,使入感觉到难于理解。实际上,用计算机解决的问题都是现实世界中的问题,这些问题无非由一些相互间存在一定联系的事物所组成,每个具体的事物都具有行为和属性两方面的特征。因此把描述事物静态属性的数据结构和表示事物的动态行为的操作放在一起构成一个整体,才能完整、自然地表示客观世界中的实体面向对象方法和技术以对象为核心。对象是由数据和

47、容许的操作组成的封装体,与客观实体有直接的对应关系。对象之间通过传递消息互相联系,以模拟现实世界中不同事物彼此之间的联系。面向对象的基本原理是,使用现实世界的概念抽象地思考问题,从而自然地解决问题。(2)稳定性好因为面向对象的软件系统的结构是根据问题域的模型建立起来的,而不是基于对系统应完成的功能的分解,所以,当对系统的功能需求变化时并不会引起软件结构的整体变化,往往仅需要作一些局部性的修改。而传统的软件开发方法以算法为核心,开发过程基于功能分析和功能分解。当功能需求发生变化时将引起软件结构的整体修改。(3)可重用性好软件重用是指在不同的软件开发过程中重复地使用相同或相似软件元素的过程,是提高

48、软件生产效率的最主要方法。使用传统的方法开发软件时,人们强调的是功能的抽象,认为具有功能内聚性的模块是理想的模块,也就是说,如果一个模块完成一个且只完成一个相对独立的子功能,那么这个模块就是理想的可重用模块,而且这样的模块也更容易维护。但是,事实上具有功能内聚性的模块并不是自含的和独立的,相反,它必须在数据上运行。如果要重用这样的模块,则相应的数据一也必须重用如果新产品中的数据与最初产品中的数据不同,则要么修改数据要么修改这个模块。面向对象的软件开发技术在利用可重用的软件成分构造新的软件系统时,有很大的灵活性。有两种方法可以重复使用一个对象类:一种方法是创建该类的实例,从而直接使用它;另一种方

49、法是从它派生出一个满足当前需要的新类。(4)易于开发大型软件产品当开发大型软件产品时,组织开发入员的方法不恰当往往是出现问题的主要原因。用面向对象模型开发软件时,可以把一个大型产品看作是一系列本质上相互独立的小产品来处理,这就不仅降低了开发的技术难度,而月也使得对开发工作的管理变得容易。(5)可维护性好用面向对象开发的软件可维护性好,原因如下:用面向对象的方法开发的软件稳定性比较好当对软件的功能或性能的要求发生变化时,通常不会引起软件的整体变化,往往只需对局部做一些修改。用面向对象的方法开发的软件比较容易修改在面向对象方法中,核心是类(对象),它具有理想的模块机制,独立性好,修改一个类通常很少会牵扯到其他类。面向对象技术特有的继承机制,使得对所有开发的软件的修改和扩充比较容易实现,通常只需从已有类派生出一些新类,无需修改软件原有成分。面向对象技术的多态性机制,使得当扩充软件功能时对原有代码的修改进一步减少,需要增加的新代码也比较少。用面向对象的方法开发的软件比较容易理解

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报