公共基础知识讲义
![公共基础知识讲义](https://img.360docs.net/img32/15xp1xjbf0064n9dqmqnrlkp1ko5cprl-21.webp)
![公共基础知识讲义](https://img.360docs.net/img32/15xp1xjbf0064n9dqmqnrlkp1ko5cprl-d2.webp)
第一章:数据结构与算法(约占10分)
算法
I=1 ’给变量I赋值为1
S=0 ’给变量S赋值为0
Do while I<=100 ’循环结构:当I小于100时循环
S=S+I ’对I的值累加求和
I=I+1 ’变量I的值每循环一次增加1
ENDDO ’循环结构:遇到ENDDO就返回DO处重新循环MSGBOX S ’输出求和变量S的值
算法是指解题方案的准确而完整的描述。
算法规定了解决某类问题所需的操作语句以及执行顺序,使其能通过有限的指令语句,在一定时间内解决问题。
算法是一个操作序列、有限长度、目的是解决某类问题。
注意:1、算法不等同于数学上的计算方法:因为很多数学计算公式也许无法在计算机上实现。
2、算法也不等同于程序:因为程序的编制不可能优于算法的设计。
算法的基本特征(算法具有动态性):可行性、确定性、有穷性、拥有足够的情报(指的是有输入和输出)
在设计一个算法时,必须要考虑算法的执行过程保证结果的可靠性。
算法的基本元素
第一要素:对数据对象的运算和操作
算数运算+ - * /
逻辑运算NOT AND OR
数据传输赋值,输入与输出
第二要素:算法的控制结构(决定了算法中各操作的执行顺序)顺序、选择、循环
算法设计的基本方法(计算机解题的过程实际上是实施某种算法)列举法(列举所有的解决方案)
根据提出的问题,列举所有可能的情况,并用问题中给定的条件检验哪些是需要的哪些是不需要的。
归纳法(特殊->一般)适合于列举量为无限的情况
通过列举少量的特殊情况,经过分析,最后找出一般的关系递推法(已知->未知)
从已知的初始条件出发,逐次推出所要求的各中间结果和最后结果递归法(逐层分解)
将一个复杂问题归结为若干个较简单的问题,然后将这些较简单的内一个问题再归结为更简单的问题。。。
减半递推法(对问题分而治之)
“减半”是指将问题的规模减半,而问题的性质不变。所谓“递推”是指重复“减半”的过程
回溯法
复杂应用,找出一个解决问题的线索,然后沿着这个线索逐步多次“探、试”
算法的复杂度(一个算法所要付出的代价)
算法的复杂度可分为:时间复杂度和空间复杂度算法的复杂度是衡量算法好坏的量度。
1)时间复杂度
概念:指执行算法所需要的计算工作量(即算法的运算次数)
含义:算法执行过程中所需要的基本运算次数
影响计算工作量的主要因素:
第一、基本运算次数第二、问题规模
下面的方法不能用来度量算法的时间复杂度:
1)算法程序的长度或算法程序中语句(指令)条数
2)算法程序所执行的语句条数
3)算法程序执行的具体时间
时间复杂度的具体度量方法:在同一问题规模下,如果算法执行所需的基本运算次数取决于某一特定的输入时,可以用以用以下两种方法来分析的工作量:1)平均性态分析2)最坏情况复杂性分析
2)空间复杂度
概念:空间复杂度是指执行该算法所需要的存储空间、输入的初始数据所占的存储空间、算法执行过程中的额外空间。
注意:1)如果额外空间量相对于问题规模来说是常数,即额外空间量不随问题规模变化而变化,则称该算法是原地工作的
2)为了降低算法的空间复杂度,主要应减少需要处理的数据所占的存储空间以及额外空间,通常采用压缩存储技术。
考题练习
1、下列叙述正确的是
A)算法就是程序
B)算法强调的是利用技巧提高程序的执行效率
C)设计算法时只需考虑结果的可靠性
D)以上三种说法都不对
2、下面叙述正确的是
A)算法的执行效率与数据的存储结构无关
B)算法的空间复杂度是指算法程序中指令(或语句)的条数C)算法的有穷性是指算法必须能在执行有限个步骤之后终止D)以上三种描述都不对
3、下列叙述中正确的是
A)一个算法的空间复杂度大,则其时间复杂度也必定大B)一个算法的空间复杂度大,则其时间复杂度必定小
C)一个算法的时间复杂度大,则其空间复杂度必定小
D)以上说法都不对
4)算法的空间复杂度是指
A)算法程序中变量的个数
B)算法程序中指令的条数
C)算法程序中各控制变量所占的额外空间
D)算法执行过程中所需的存储空间
数据结构
目的:提高数据的处理效率(一是提高数据处理的速度二是节省在数据处理过程中所占用的计算机存储空间)
基本概念
1)数据:在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
2)数据元素:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
3)数据结构:是互相之间存在一种或多种特定关系的数据元素的集合。
数据结构的内容:
逻辑结构:数据元素之间的逻辑关系,从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
存储(物理)结构:是指数据元素及其关系在计算机内存中的表示,即数据的逻辑结构在计算机存储空间中的存放形式。
注意:对于同一个逻辑结构来说,采用不同的存储结构,其数据处理的效率是不同的。因此,在数据处理时,选择适合的存储结构很重要。
各数据元素在计算机存储空间中的位置关系与它们的逻辑关系不一定相同。
由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此,为了表示存放各数据元素的本身,而且还需要存放各数据元素之间的前后件关系的信息。
逻辑结构与物理结构的关系
1)一种逻辑结构可以用不同的物理结构来实现
2)逻辑结构决定了算法的设计
3)物理结构决定了算法的实现
数据结构的图形表示
表示数据结构的常用方法:二元关系表和图形表示
例:一年四季的数据结构可以用图形表示为:
春->夏->秋->冬
1)数据元素:用中间标有元素值的方框来表示,称为数据结点,简称结点。
2)元素之间的前后关系:用一条有向线段从前件结点指向后件结点(注意有时可以省略箭头)
在数据结构中,没有前件的结点称为根结点,没有后件的结点称为终结结点(也称为叶子结点),其他的称为内部结点。
数据结构的分类:线性结构与非线性结构
根据数据结构中个数据元素之间的前后关系的复杂度,一般将数据结构分成两大类:线性结构和非线性结构。
注意:线性结构与非线性结构是在数据的逻辑结构概念下的一种划分方法,与数据的存储结构无关。前面说过,一种数据的逻辑结构根据需要可以表示成多种存储结构,但只要数据的逻辑结构是属于线性结构,则该逻辑结构的任意一种存储结构也都术语线性结构。
线性结构的定义
如果一个非空的数据结构满足下列两个条件:
1有且只有一个根结点(没有前件的结点称为根结点)
2)每个结点最多有一个前件,也最多由一个后件。则称该数据结构为线性结构,线性结构又称线性表
3)线性结构的操作
在一个线性结构中插入或删除任何一个结点后还应是线性结构
线性表
1)线性表就是线性结构
2)线性表的顺序存储结构也称为顺序表
3)在顺序表中,所有元素所占的存储空间是连续的,且各数据元素在存储空间中是按逻辑顺序依次存放的,其前后两个元素在存储空间中是紧邻的,且前件元素一定存储在后件元素的前面。
4)线性表的长度:是指线性表中的结点个数,当n=0时,称为空表。
5)通常定义一个一维数组来表示线性表的顺序存储控件。用一维数组来存放线性表时,该一维数组的长度不要定义太短,也不要定义太长。
顺序表(线性表的顺序结构)的插入运算:最坏情况下,N个元素的线性表要移动N次,顺序表的删除运算:最坏情况下,N个元素的线性表要移动N-1次。综上所述:线性表的顺序存储结构对于经常需要变动的大线性表就不合适了,因为插入和删除的效率比较低。
栈
栈的定义:栈是一种特殊的线性表,即限定在一端进行插入和删除的线性表栈顶、栈底的定义:在栈中,允许插入和删除的一端称为栈顶,而不允许插
入和删除的另一端称为栈底
入栈、退栈的定义:往栈中插入一个元素叫入栈运算(压栈),从栈中删除一个元素称为退栈运算。
栈的数据操作原则:先进后出FILO(也叫后进先出)
栈具有记忆功能。
注意:1)在顺序存储结构下,栈的插入与删除运算都不需要移动表中的其他数据元素。
2)在栈中,栈顶指针动态反映了栈中元素的变化情况。
栈的存储结构与运算
栈的存储结构:在程序设计语言中,与普通线性表一样,用一维数组作为栈S(1:M)的顺序存储结构,其中M为栈的最大容量。
栈的基本运算:入栈、退栈和读栈顶元素。
在顺序结构下的读栈顶元素是指将栈顶元素赋值给一个指定的变量。(读不是删除,删除一定要先读。在只读的情况下,原来是多少,读后还是多少。)读栈顶元素过程中应注意的问题:
1)读栈顶怨毒不删除栈顶元素,只是将它的值赋给一个变量。因此在这个运算中栈顶指针不会改变。
2)当栈顶指针为零时,说明栈为空,读不到栈顶元素。
队列
队列的定义:队列也是一种特殊的线性表,即允许在一进行插入,而另一端进行删除的线性表
允许插入的一端叫队尾(为指针rear)
允许删除的一端叫队头(头指针,front)注意:在尾上插入,头上删除
队列的数据操作方法是:先进先出
在顺序存储结构下,队列的插入与删除运算都不需要移动表中的其他数据元素
在实际应用中,队列的顺序存储结构一般采用循环队列的形式,方法是将队列存储空间的最后一个位置绕到第一个位置,就形成逻辑上的环状空间,供队列循环使用。
确定循环队列中元素个数的方法如下:
设循环队列的容量为M,如果rear>front,则循环队列中的元素个数为rear-front;如果rear 循环队列的运算有两个 1)入队运算:是在循环队列的队尾加入一个新元素,也就是rear=1 2)退队运算:是在循环队列的排头位置退出一个元素并赋给指定的变量, 也就是front+1程序设计中用一维数组作为队列的顺序存储空间。 队列的实际应用实例 在操作系统中,用队列来组织管理用户程序的排队执行,其原则是:1)初始时该队列为空,2)当有用户程序来到时,将该用户程序加入到队列末尾进行等待3)当计算机系统执行完当前的用户程序后,就从队列头部取出一个用户程序执行。 线性表的顺序存储结构的缺点 第一、在插入和删除时需要移动元素(栈和队列除外) 第二、上溢错误的出现,即存储空间不便于扩充 第三、不便于对存储空间的动态分配 线性链表 一、链式存储方式 对于大的线性表或者变动频繁的线性表不宜用顺序存储,应该用链式存储。 链式存储的结点:由两部分组成,一部分用于存储数据元素值,称为数据域,另一部分用于存放指针,称为指针域。指针域用来指向该结点的后一个(或前一个)结点。 链式存储的特点(注意与顺序存储方式的区别) 1)在链式存储结构中,存储数据结构的存储空间可以是不连续的。 2)各结点的存储顺序与数据元素之间的逻辑关系可以不一致 3)链式存储方式可以用于线性结构,也可以用于非线性结构 注:线性链表是线性表的链式存储结构;带链的栈是栈的链式存储结构;带链的队列是队列的链式存储结构。 注意:线性链表在插入与删除过程中均不发生数据元素移动的现象,只需改变有关结点的指针即可。 树与二叉树 树是一种非线性结构,所有数据元素之间的关系具有明显的层次特性 结点的度的定义:子树的个数,即拥有的后件个数称为该结点的度 树的度的定义:树中所有结点的度的最大值 叶子节点的定义:度为零的结点,即没有后件的结点 分支节点的定义:度大于非零的结点 度的深度的定义:树中叶子结点所在的最大层次(注意:根结点在第1层) 路径的定义:由根到该结点所经分支和结点构成 注意:线性结构与树形结构的区别 二叉树的定义:是一种特殊的树,非空二叉树只有一个根结点。每个结点最多有两棵子树,其分别称为该结点的左子树和右子树(注意:左右两个子树的次序不能任意颠倒) 二叉树的基本性质 1)在二叉树的第K层上,最多有2k-1(k>=1)个结点。 2)深度为M的二叉树最多有2m-1个结点。 3)在任意一棵二叉树中,度为0的结点(即叶子结点)总比度为2的结点多一个。 4)具有n个结点的二叉树,其深度至少为[log2n]+1其中[log2n]表示log2n取的整数部分 5)具有n个结点的完全二叉树的深度为[log2n]+1 满二叉树与完全二叉树是特殊的二叉树 满二叉树的定义:是指除最后一层之外,每一层上的所有结点都有两个子节点。(注意不要混淆二叉树与满二叉树的概念) 满二叉树的特征:满二叉树上的第k层上有2k-1个结点 完全二叉树的定义:除最后一层之外,每一层上的节点数均达到了最大值,在最后一层上只缺少右边的若干个结点。 二叉树的存储结构:在计算机中存储二叉树时,除了可以将满二叉树与完全二叉树按层次进行顺序存储之外,其余二叉树通常采用链式存储结构。二叉树的链式存储结构也称为二叉链表。 二叉树的遍历以根据根结点的遍历顺序可分为: 前序遍历:根、左、右 中序遍历:左、根、右 后续遍历:左、右、根 考题练习: 1)在一棵二叉树上第5层的结点数最多是 A)8 B)16 C)32 D)15 2)某二叉树中度为2的结点有18个,则该二叉树中有()个叶子结点。 3)一棵二叉树第六层(根结点为第一层)的结点数最多为()个 4)在深度为7的满二叉树中,叶子结点的个数为() 5)有如右边的二叉树,进行后续遍历的结果为() 6)对右列二叉树进行中序遍历的结果是() 查找技术 顺序查找:从线性表的第一个元素开始,依次将线性表中的元素与被查元素进行比较,若相等则表示查找成功;若找不到相等的则查找失败。 对于庞大的线性表来说,顺序查找的效率是很低的,但是在下列两种情况下只能采用顺序查找: 1)线性表是无序表(即表中的元素的排列是无序的),则不管是顺序结构还是链式结构,都只能用顺序查找 2)即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。 -5 0 3 4 9 12 15 25 49 100 2)对于长度为n的有序线性表,在最坏的情况下,二分查找只需要比较log2n次,而顺序查找需要比较n次。 交换类排序法的定义:是指借助数据元素之间的相互交换进行排序的一种方法。 复习题: 一、算法 1、计算机解题的过程实际上是在实施某种算法,在列举量为无限的情况下,应采用的设计方法是() 2、算法共有三种逻辑结构,顺序结构,条件结构和循环结构,下列说法正确的是() A)一个算法只能有一种逻辑结构 B)一个算法最多可以包含两种逻辑结构 C)一个算法必须含有上述三种逻辑结构 D)一个算法可以含有上述三种逻辑结构的任意组合 3、要能够比较客观的反映出一个算法的效率,要求: A)与使用的计算机和程序设计的语言无关 B)与程序编制者无关 C)与算法实现过程中的许多细节无关 D)都对 4、下面的方法中能用来度量算法的时间复杂度的是 A)算法程序的长度或算法程序中语句(指令)条数 B)算法程序所执行的语句条数 C)算法程序执行的具体事件 D)算法所执行的基本运算次数 二、数据结构 1、下列叙述中正确的是 A数据的逻辑结构与存储结构必定是一一对应的 B由于计算机存储空间是向量式的存储结构,因此,数据的存储结构一定是线性结构 C程序设计语言中的数组一般是顺序存储结构,因此利用数组只能处理线性结构D以上三种说法都不对 2、下列叙述中正确的是 A顺序存储结构的存储一定是连续的,链式存储结构的存储空间比一定是连续的B顺序存储结构只针对线性结构,链式存储结构只针对非线性结构 C顺序存储结构能存储有序表,链式存储结构不能存储有续表 D链式存储结构比顺序存储结构节省存储空间 三、线性表栈队列 1、下列叙述中正确的是 A栈是先进先出的线性表 B队列是先进后出的线性表 C循环队列是非线性结构 D有序线性表即可以采用顺序存储结构,也可以采用链式存储结构 2、一个栈初始状态为空,将元素1、2、 3、 4、 5、A、B、C、D、E依次入栈,然后在依次出栈,则元素的出栈顺序是 A)12345ABCDE B)EDCBA54321 C)ABCDE12345 D)54321EDCBA 3、下列叙述中正确的是 A在栈中,栈中元素随栈底指针与栈顶指针变化而动态变化 B在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化 C在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化 D上述三种说法都不对 4、一个栈的初始状态为空,首先将元素 5、4、3、2、1依次入栈,然后退栈一次,再将元素ABCD依次入栈,之后将所有元素全部退栈,则所有元素退栈(包括中间退栈的元素)的顺序为() 5、假设一个长度为50的数组(数组元素的下标从0到49)最为栈的存储空间,栈底指针bottom指向栈底元素,栈顶指针top指向栈顶元素,如果bottom=49,top=30(数组下标),则栈中具有()个元素 6、一个队列的初始状态为空,现将元素ABCDEF54321依次入列,然后在依次退队,则元素退队的顺序为() 7、设某循环队列的容量为50,如果头指针front=45,尾指针rear=10,则循环队列中共有()个元素 四、线性表、栈、队列的链式存储结构(一切操作靠指针) 1、下列数据结构中,属于非线性结构的是 A循环队列 B带链队列 C二叉树 D带链栈 五、树 1、一棵二叉树中够有70个叶子节点与80个度为一的结点,则该二叉树总结点数为 A219 B221 C229 D231 六、查找技术 1、下列叙述正确的是 A对长度为n的有序链表进行查找,最坏情况下需要比较的次数为n B对长度为n的有序链表进行对分查找,最坏情况下的比较次数为(n/2) C对长度为n的有序链表进行对分查找,最坏情况下的比较次数为(log2n) D对长度为n的有序链表进行对分查找,最坏情况下的比较次数为(n log2n) 2、在长度为n的线性表中,寻找最大项至少需要比较()次 七、排序技术 1、下列排序方法中,最坏情况下比较次数最少的是 A冒泡排序B简单选择排序C直接插入排序D堆排序 第二章:程序设计基础(约占4分) 程序设计设计方法和风格 程序设计的风格强调简单和清晰,程序必须是可以理解的 1、设计的风格 程序设计的根本目标是要降低程序的复杂性和提高程序的可读性 1)结构要清晰:程序编写要做到清晰第一,效率第二;要求程序是模块化结构的,每个模块内部都由顺序、选择、循环三种基本结构组成 2)模块化:各模块的功能尽量单一 3)设计程序时应遵循“简短朴实”的原则 4)不好的程序宁可重写,也不要去修补 注意:模块与模块之间要低耦合,模块内部应高内聚。 2、语言应用的风格 1)选择合适的程序设计语言(比如数据库应用的可以用VF和ACCESS,编写小型软件可选用VB 2)对一些程序设计语言中的灵活大,不易理解的语句尽量不要使用 3、程序文本的风格 1)程序的层次要分明,在各层次之间应采用缩进规则 2)符号要规范,变量名的命名要遵循“常用从简,专用从繁”的原则 3)在程序中加必要的注释注释分序言注释和功能性注释 4)在程序中要合理地使用分隔符 4、输入与输出的风格 1)在需要输入数据时,应该给出必要的提示 2)要对输入的数据进行检验,以确认其有效性 3)输入的步骤和操作要简单 4)要给输出加注释 结构化程序设计 结构化程序设计方法的四条原则是:1、自顶向下;2、逐步求精;3、模块化;4、限制使用goto语句 自顶向下:总体-细节;全局-局部 逐步求精:对复杂程序设计子目标过度 模块化:总目标分成分目标再分小目标(模块),上层模块决定做什么,下层模块告诉我们怎么做 限制使用goto语句:不滥用、慎使用、清晰性为目标 1、结构化程序的基本特点: 以控制结构为单位,只有一个入口和一个出口,使各单位之间的接口比较简单 1)顺序结构:一种简单的程序设计,最基本、最常用的结构 2)选择结构:又称分支结构,包括简单选择和多分支选择结构,可根据条 件,判断应该选择哪一条分支来执行相应的语句序列 3)重复结构:又称循环结构,可根据给定条件,判断是否需要重复执行某一相同程序段 结构化程序设计的基本原则有: 1)使用程序设计语言中的顺序、选择、循环等有限的控制结构表示程序的控制逻辑 2)选用的控制结构只准许一个入口和一个出口 3)复杂结构应该用嵌套的基本控制结构进行组合嵌套来实现 4)程序语句组成容易识别的块,每块只有一个入口和一个出口 5)语言中所没有的控制接口,应采用前后一致的方法来模拟 6)严格控制goto语句的使用 程序设计并不等于编程。编程只是程序设计整个过程中的一小步 面向对象的程序设计 传统结构化程序设计方法的核心是算法;面向对象的核心是对象。 1、基本概念 对象:具有属性(数据)和方法(行为方式)的实体。 类:描述的是具有相似性性质的一组对象。一个具体对象称为类的实例。 方法:允许作用于某个对象上的各种操作 消息:用来请求对象执行某一处理或回答某些信息的要求 继承:类之间的相似性的机制 封装:是一种信息隐藏技术,目的在于将对象的使用者和对象的设计者分开。用户只能见到对象封装界面上的信息,不必知道实现的细节。封装一方面通过数据抽象,把相关的信息结合在一起,应一方面也简化了接口。 2、面向对象方法的优点: 1)与人类习惯的思维方法一致 2)稳定性好 3)可重用性好 4)易于开发大型软件产品 5)可维护性好 3、队形的基本特点 1)标识唯一性2)分类性3)多态性4)封装性5)模块独立性好 考题练习: 1、下列选项不符合良好程序设计风格的是() A)源程序要文档化 B)数据说明的次序要规范化 C)避免滥用goto语句 D)模块设计主要保证高耦合高内聚 2、下面描述中,符合结构化程序设计风格的是() A)使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑B)模块只有一个入口,可以有多个出口 C)注重提高程序的执行效率 D)不使用goto语句 3、下列选项中不属于结构化程序设计方法的是() A)自顶向下B)逐步求精C)模块化D)可复用 4、下面概念中,不属于面向对象方法的是 A)对象B)继承C)类D)过程调用 5、在面向对象方法中,类的实例称为() 6、在面向对象方法中,()描述的是具有相似属性与操作的一组对象