1、全国计算机等级考试,公共基础知识,主讲教师:杨柳,基本要求:,1、 掌握算法的基本概念。 2、 掌握基本数据结构及其操作。 3、 掌握基本排序和查找算法。 4、 掌握逐步求精的结构化程序设计方法。 5、 掌握软件工程的基本方法,具有初步应用相关技术进行软件开发的能力。 6、 掌握数据的基本知识,了解关系数据库的设计。,第一章 数据结构与算法,考试内容:1. 算法的基本概念;算法复杂度的概念和意义(时间复杂度与空间复杂度)。 2. 数据结构的定义;数据的逻辑结构与存储结构;数据结构的图形表示;线性结构与非线性结构的概念。 3. 线性表的定义;线性表的顺序存储结构及其插入与删除运算。 4. 栈和队
2、列的定义;栈和队列的顺序存储结构及其基本运算。 5. 线性单链表、双向链表与循环链表的结构及其基本运算。 6. 树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。 7. 顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)。,算法,算法的基本概念:所谓算法是指解题方案的准确而完整的描述。算法的基本特征: 可行性 确定性 有穷性 拥有足够的情报 综上所述:所谓算法,是一组严谨地定义运算顺序的规则,并且每一个规则都是有效的,且是明确的,此顺序将在有限的次数下终止。算法的基本要素: 数据对象的运算和操作算术运算逻辑运算关系运算数据传输,算法的基本概念:算法
3、的控制结构顺序选择循环算法设计基本方法列举法归纳法递推法递归法减半递推技术回溯法,算法复杂度:算法的时间复杂度:是指执行算法所需要的计算工作量。算法在执行过程中用所需基本运算的执行次数来度量算法的工作量。算法的空间复杂度:一般是指执行这个算法所需要的内存空间。,数据结构的基本概念,什么是数据结构?简单地说,数据结构是指相互有关联的数据元素的集合。数据元素具有广泛的含义,一般来说,现实世界中客观存在的一切个体都可以是数据元素。由上所述,一个数据结构应包含以下两方面的信息:1)表示数据元素的信息2)表示各数据元素之间的前后件关系(即逻辑关系,与位置无关)数据的逻辑结构:反映数据元素之间逻辑关系的数
4、据结构。数据的存储结构:即数据的逻辑结构在计算机存储空间中的存放形式。(也称为数据的物理结构。)一般来说,一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接、索引等存储结构。,数据结构的图形表示,春,夏,秋,冬,父亲,儿子,女儿,例:用图形表示数据结构B=(D,R),其中D=di|1i 7=d1,d2,d3,d4,d5,d6,d7R=(d1,d3),(d1,d7),(d2,d4),(d3,d6),(d4,d5),线性结构与非线性结构如果一个非空的数据结构满足下列两个条件:1)有且只有一个根结点。2)每一个结点最多有一个前件,也最多有一个后件。则称该数据结构为线性结构,
5、线性结构又称线性表。如果在一个数据结构中一个数据元素都没有,则称该数据结构为空的数据结构。一个空的数据结构空间是属于线性结构还是属于非线性结构,这要根据具体情况来确定。,线性表的基本概念:线性表是一种线性结构,数据元素在线性表中的位置只取决于它们自己的序号,即数据元素之间的相对位置是线性的。非空线性表有如下一些结构特征:1)线性表中所有元素所占的存储空间是连续的。2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。,线性表及其顺序存储结构,线性表及其顺序存储结构,假设线性表中的第一个数据元素的存储地址(指第一个字节的地址,即首 地址)为ADR(a1),每一个数据元素占k个字节,则线性表中
6、第i个元素ai 在计算机存储空间中的存储地址为ADR(ai)=ADR(ai)+(i-1)k 一般来说,长度为n的线性表(a1,a2,ai,an)在计算机中的 顺序存储结构如下图所示:,顺序表的插入运算:在一般情况下,要在第i(1i n)个元素之前插入一个新元素时,首先要从最后一个(即第n个)元素开始,直到第i个元素之间共n-i+1个元素依次向后移动一个位置,移动结束后,第i 个位置就被空出。在线性表顺序存储的情况下,要插入一不念旧恶新元素,其效率是很低的。 顺序表的删除运算:在一般情况下,要删除第i(1i n)个元素时,则要从第i+1个元素开始,直到第n个元素之间共n-i个元素依次向前移动一个
7、位置。由线性表在顺序存储结构下的插入与删除运算可以看出,线性表的顺序存储结构对于小线性表或者其中元素不常变动的线性表来说是合适的,因为顺序存储的结构比较简单。但这种顺序存储的方式对于元素经常需要变动的大线性表就不太合适了,因为插入与删除的效率比较低。,线性表及其顺序存储结构,栈和队列,栈及其基本运算什么是栈?是限定在一端进行插入与删除的线性表。 栈顶:在栈中允许插入与删除的一端。用指针TOP指示。 栈底:在栈中不允许插入与删除的另一端。用指针Bottom指示。栈是按照”先进后出“或”后进先出“的原则组织数据的。往栈中插入一个元素称为入栈运算;从栈中删除一个元素(即删除栈顶元素)称为退栈运算。栈
8、的顺序存储及其运算 与一般的线性表一样,在程序设计语言中,用一维数组S(1:M)作为栈的顺序存储空间,其中M为栈的最大容量。S(bottom)通常为栈底元素,S(top)为栈顶元素,top=0表示栈空;top=m表示栈满。栈的基本运算有三种:入栈、退栈与读栈顶元素。,队列及其基本运算:什么是队列(queue)?是指允许在一端进行插入、而在另一端进行删除的线性表。允许插入的一端为队尾,通常用一个称为尾指针(rear)的指针指向队尾元素;允许删除的一端称为排头(也称为队头),通常也用一个排头指针(front)指向排头元素的前一个位置。队列又称为“先进先出”或“后进后出”的线性表,它体现了“先来先服
9、务”的原则。循环队列及其运算 所谓循环队列,就是将队列存储空间的最中一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。 基本运算:入队运算与退队运算当循环队列非空且队尾指针等于排头指针时,说明循环队列已满,不能进行入队运算,这种情况称为“上溢”;当循环队列为空时,不能进行退队运算,这种情况称为“下溢”。,树与二叉树,树的基本概念:树是一种简单的非线性结构。在树这种数据结构中,所有数据元素之间的关系具有明显的层次特性。在树结构中,每一个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点。每一个结点可以有多个后件,它们都称为该结点的子结点。没有后件的结点称为叶子结点。
10、一个结点所拥有的后件个数称为该结点的度。在树中,所有结点中的最大的度称为树的度。树的最大层次称为树的深度。,树与二叉树,二叉树及其基本性质:1、什么是二叉树?二叉树是一咱很有用的非线性结构。二叉树不同于前面介绍的树结构,但它与树结构很相似,并且,树结构的所有术语都可以用到二叉树这种数据结构上。二叉树具有以下两个特点:1)非空二叉树只有一个根结点。2)每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。二叉树的基本性质:1)在二叉树的第K层上,最多有2k-1(k=1)个结点。2)深度为m的二叉树最多有2m-1个结点。3)在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一
11、个。4)具有n个结点的二叉树,其深度至少为log2n+1,其中log2n表示取log2n的整数部分。,满二叉树与完全二叉树:所谓满二叉树是指这样的一种二叉树:除最后一层外,每一层上的所有结点都有两个子结点。所谓完全二叉树是指这样的二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。由满二叉树与完全二叉树的特点可以看出,满二叉树也是完全二叉树,而完全二叉树一般不是满二叉树。完全二叉树还具有以下两个性质:1、具有n个结点的完全二叉树的深度为log2n+1。2、设完全二叉树共有n个结点。如果从根结点开始,按层序(每一层从左到右)用自然数1,2,n给结点进行编号,则对
12、于编号为k (k=1,2,,n)的结点有以下结论:,1)若k=1,则该结点为根结点,它没有父结点;若k1,则该结点的父结点编号为int(k/2).2)若2k n,则编号为k的结点的左子结点编号为2k,否则该结点无 左子结点(显然也没有右子结点)。3)若2k+1 n,则编号为k的结点的右子结点编号为2k+1;否则该结点无右子结点。 二叉树的遍历:是指不重复地访问二叉树中的所有结点。 A、前序遍历(DLR):是指在访问根结点、遍历左子树与遍历右子树这三者中,首先访问根结点,然后遍历左子树,最后遍历右子树;并且在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。 B、中序遍历(LD
13、R):是指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。 C、后序遍历(LRD):是指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后遍历右子树,最后访问根结点,并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。,查找技术:,顺序查找:在进行顺序查找过程中,如果线性表中的第一个元素就是被查找元素,则只需做一次比较就查找成功,查找效率最高;但如果被查的元素是线性表中的最后一个元素,或者被查元素根本不在线性表中,则为了查找这个元素需
14、要与线性表中所有的元素进行比较,这是顺序查找的最坏情况。在平均情况下,利用顺序查找法在线性表中查找一个元素,大约要与线性表中一半的元素进行比较。对于大的线性表来说,顺序查找的效率是很低的,虽然顺序查找的效率不高,但在下列两种情况下也只能采用顺序查找:1)如果线性表为无序表(即表中元素的排列是无序的),则不管是顺序存储结构还是链式存储结构,都只能用顺序查找。2)即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。 二分法查找:只能用于顺序存储的有序表。(在此所说的有充表是指线性表中的元素按值非递减排列(即从小到大,但允许相邻元素值相等。)对于长度为n的有序线性表,在最坏情况下,二分查找只需
15、要比较log2n次,而顺序查找需要比较n次。,排序技术:,所谓排序是指将一个无序序列整理成按值非递减顺序排列的有序序列。 交换类排序法:1、冒泡排序法:是通过相邻数据元素的交换逐步将线性表变成有序。假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后的扫描和n/2 遍的从后往前的扫描,需要的比较次数为n(n-1)/2,但这个工作不是必须的,一般情况下要小于这个工作量。2、快速排序法:首先在表的第一个、中间一个与最后一个元素中选取中项,设为P(K),并将P(K)赋给T,再将表中的第一个元素移到P(K)的位置上。然后设置两个指针i 和j 分别指向表的起始与最后的位置。反复操作以
16、下两步:(1)将j 逐渐减小,并逐次比较p(j)与T,直到发现一个p(j) T为止,将P(i)移到P(j)位置上。,排序技术:,插入类排序法:1、简单插入排序法:在最坏情况下,简单插入排序需要n(n-1)/2次比较。2、希尔排序法:在最坏情况下,希尔排序所需要的比较次数为O(n1.5) 选择类排序法:1、简单选择排序法:在最坏情况下,需要比较n(n-1)/2次。2、堆排序法:在最坏情况下,需要比较的次数为O(nlog2n),第二章 程序设计基础,就程序设计方法和技术的发展而言,主要经过了结构化程序设计和面向对象的程序设计阶段。除了好的程序设计方法和技术之外,程序设计风格也是很重要的。一般来讲,
17、程序设计风格是指编写程序时所表现出的特点、习惯和逻辑思路。 结构化程序设计方法的主要原则可以概括为自顶向下,逐步求精,模块化,限制使用goto语句。 程序设计语言仅仅使用顺序、选择和重复三种基本控制结构就足以表达出各种其他形式结构的程序设计方法。 面向对象方法的本质,就是主张从客观世界固有的事物出发来构造系统,提倡用人类在现实生活中常用的方法来认识、理解和描述客观事物。对象是由数据和容许的操作组成的封装体,与客观实体有直接的对应关系。 对象的三大特征:封装性、继承性、多态性。,第三章 软件工程基础,所谓软件危机是泛指在计算机软件的开发和维护过程中所遇到的一系列严重问题。总之,可以将软件危机归结
18、为成本、质量、生产率等问题。 软件工程就是试图用工程、科学和数学的原理与方法研制、维护计算机软件的有关技术及管理方法。软件工程包括3个要素,即方法、工具和过程。方法是完成软件工程项目的技术手段;工具支持软件的开发、管理、文档生成;过程支持软件开发的各个环节的控制、管理。 通常,将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。 软件开发方法包括分析方法、设计方法和程序设计方法。 常见的需求分析方法有:1、结构化分析方法:主要包括:面向数据流的结构化分析方法(SAStructured analysis),面向数据结构的Jackson方法,面向数据结构的结构化数据系统开发方法(
19、DSSD)2、面向对象的分析方法(OOA)从需求分析建立的模型的特性来分,需求分析方法又分为静态分析和动态分析方法。,结构化分析方法是结构化程序设计理论在软件需求分析阶段的运用。其实质是着眼于数据流,自顶向下,逐层分解,建立系统的处理流程,以数据流图和数据字典为主要工具,建立系统的逻辑模型。 结构化分析的常用工具:1、数据流图(DFD)2、数据字典(DD):是结构化分析方法的核心。其作用是对DFD中出现的被命名的图形元素的确切解释。3、判定树:4、判定表: 软件设计的基本目标是用比较抽象概括的方式确定目标系统如何完成预定的任务,即软件设计是确定系统的物理模型。从技术观点来看,软件设计包括软件结
20、构设计、数据设计、接口设计、过程设计。其中,结构设计是定义软件系统各主要部件之间的关系,数据设计是将分析时创建的模型转化为数据结构的定义;接口设计是描述软件内部,软件和协作系统之间的以及软件与人之间如何通信;过程设计则是把系统结构部件转换成软件的过程性描述。从工程管理角度来看,软件设计分两步完成:概要设计和详细设计。概要设计(又称结构设计)将软件需求转化为软件体系结构、确定系统级接口中、全局数据结构或数据库模式;详细设计确立每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节。,软件设计的基本原理:1、抽象2、模块化3、信息隐蔽4、模块独立性:衡量软件的模块独立性使用耦合性和内
21、聚性两个定性的度量的标准。内聚性是一个模块内部各个元素间彼此结合的紧密程度的度量。耦合性:是模块间互相连接的紧密程序的度量。一般较优秀的软件应尽量做到:高内聚,低耦合。常用的软件结构设计工具是结构图,也称程序结构图。经常使用的结构图有四种模块类型:传入模块、传出模块、变换模块和协调模块。 程序结构图的有关术语: 深度:表示控制的层数。 宽度:整体控制跨度(最大模块数的层)的表示。 扇入:调用一个给定模块的模块个数。 扇出:一个模块,典型的数据流类型有两种:变换型和事务型 好的软件设计结构通常顶层高扇出,中间扇出较少,底层高扇入。 软件测试的方法和技术是多种多样的。对于软件测试方法和技术,可以从
22、不同的角度加以分类。若从是否需要执行被测软件的角度,可以分为静态测试和动态测试方法。若按照功能划分可以分为白盒测试和黑盒测试方法。(静态测试包括代码检查、静态结构分析、代码质量度量等;动态测试是基于计算机的测试,是为了发现错误而执行程序的过程;白盒测试是在程序内部进行,主要用于完成软件内部操作的验证。黑盒测试方法也称功能测试或数据驱动测试。黑盒测试是对软件已经实现的功能是否满足需求进行测试和验证。 软件测试是保证软件质量的重要手段,软件测试是一个过程,其测试流程是该过程规定的程序,目的是使软件测试工作系统化。软件测试过程一般按4个步骤进行,即单元测试、集成测试、验收测试(确认测试)和系统测试。
23、(单元测试是对软件设计的最小单位模块(程序单元)进行正确性检验的测试。单元测试的目的是发现各模块内部可能存在的各种错误;集成测试是测试和组装软件的过程。它是把模块在按照设计要求组装起来的同时进行测试,主要目的是发现与接口有关的错误。集成测试的依据是概要设计说明书。集成测试所涉及的内容包括:软件单元的接口测试、全局数据结构测试、边界条件和非法输入的测试等。集成测试时将模块组装成程序通常采用两种方式:非增量方式组装与增量方式组装。确认测试的任务是验证软件的功能和性能及其他特性是否满足了需求规格说明中确定的各种需求,以及软件配置是否完全、正确。系统测试是将通过测试确认的软件,作为整个基于计算机系统的
24、一个元素,与计算机硬件、外设、支持软件、数据和人员等其他系统元素组合在一起,在实际运行环境下对计算机系统进行一系列的集成测试和确认测试。,程序调试的任务是诊断和改正程序中的错误。它与软件测试不同,软件测试是尽可能多地发现软件中的错误。软件测试贯穿整个软件生命期,调试主要在开发阶段。,第四章 数据库设计基础,数据完整性与安全性的维护是数据库管理系统的基本功能。 数据库管理系统一般提供相应的数据语言,它们是:数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)。上述数据语言按其使用方式具有两种结构形式:交互式命令语言(又称为自含型或自主型语言)。宿主型语言 数据独立性是数据与程序
25、间的互不依赖性,即数据库中数据独立于应用程序而不依赖于应用程序。数据独立性一般分为物理独立性与逻辑独立性两级。数据库系统在其内部具有三级模式及二级映射,三级模式分别是概念级模式、内部级模式与外部级模式,二级映射则分别是概念级到内部级的映射以及外部级到概念级的映射。,数据库系统的三级模式包括:1、概念模式:是数据库系统中全局数据逻辑结构的描述,是全体用户(应用)公共数据视图。2、外模式:也称子模式或用户模式。它是用户的数据视图,也就是用户所见到的数据模式,它由概念模式推导而出。3、内模式:又称物理模式,它给出了数据库物理存储结构与物理存取方法,如数据存储的文件结构、索引等存取方式与存取路径,内模式的物理性主要体现在操作系统及文件级上,它还未深入到设备级上(如磁盘及磁盘操作) 数据模型所描述的内容有三个部分:它们是数据结构、数据操作与数据约束。数据模型按不同的应用层次分成三种类型,它们是概念数据模型(概念模型)、逻辑数据模型(数据模型)、物理数据模型(物理模型) 目前,逻辑数据模型也有很多种,较为成熟并先后被人们大量使用过的有:层次模型、网状模型、关系模型、面向对象模型等。 长期以来被广泛使用的概念模型是E-R模型(实体联系模型),