计算机二级 公共基础知识第1章 数据结构与算法.docx
- 文档编号:30064798
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:51
- 大小:537.07KB
计算机二级 公共基础知识第1章 数据结构与算法.docx
《计算机二级 公共基础知识第1章 数据结构与算法.docx》由会员分享,可在线阅读,更多相关《计算机二级 公共基础知识第1章 数据结构与算法.docx(51页珍藏版)》请在冰豆网上搜索。
计算机二级公共基础知识第1章数据结构与算法
第1章数据结构与算法(13%)
重要考点提示:
1)算法复杂度。
2)栈、队列、线性链表的基本概念
3)二叉树的存储结构
4)线性表、树的结点计算和遍历
5)冒泡排序的最坏次数计算
一、算法
考点1算法的基本概念记一些概念即可
1、算法:
对解题方案的准确而完整的描述。
重点
2、算法的基本特征重点
①可行性
针对实际问题设计的算法,人们总是希望能够得到满意的结果。
但一个算法又总是在某个特定的计算工具上执行的,因此算法在执行过程中往往要受到计算工具的限制,使执行结果产生偏差。
算法与计算公式是有差别的,在设计一个算法时,必须考虑它的可行性,否则将得不到满意的结果。
②确定性
算法的确定性是指算法中的每一个步骤必须有明确的定义,不能产生歧义。
这一性质也反映了算法与数学公式的明显差别。
③有穷性
算法的有穷性,是指算法必须能在有限的时间内做完,即算法必须能在执行有限个步骤之后终止。
算法的有穷性还包括合理的执行时间的含义,因为如果一个算法需要执行千万年,显然失去了价值。
④拥有足够的情报
一个算法是否有效,还取决为算法所提供的情报是否足够。
通常,算法中的各种运算总是要施加到各个运算对象上,而这些运算对象又可能具有某种初始状态,这是算法执行的起点或是依据。
因此,一个算法执行的结果总是与输入的初始数据有关,不同的输入将会有不同的结果输出。
当输入不够或输入错误时,算法本身也就无法执行或导致执行有错。
一般来说,当算法拥有足够的情报时,此算法才是有效的,而当提供的情报不够时,算法可能无效。
有的认为是:
可行性、确定性、有穷性、有输入、有输出。
3、算法的基本要素重点
①算法中对数据的运算和操作
②算法的控制结构
可理解为:
一个算法是由控制结构(顺序、分支和循环三种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。
即:
算法=控制结构+原操作
(固有数据类型的操作)
解释:
了解
①算法中对数据的运算和操作
每个算法实际上是按解题要求,从环境能进行的操作中选择合适的操作所组成的一组指令序列。
因此,计算机算法就是计算机能处理的操作所组成的指令序列。
通常,计算机可以执行的基本操作以指令形式来描述,所有指令的集合构成计算机指令系统。
计算机程序就是按解题要求从计算机指令系统中选择合适的指令所组成的指令序列。
在一般的计算机系统中基本的运算和操作有以下4类:
算术运算、逻辑运算、关系运算、数据传输(如输入输出、赋值等)。
计算机程序也可以作为算法的一种描述,但由于在编制计算机程序时,通常要考虑很多与方法和分析无关的细节问题(如语法规则),因此,在设计算法的一开始,通常并不直接用计算机程序来描述算法,而是用别的描述工具(如流程图,专门的算法描述语言、自然语言)来描述算法。
但不管用哪种工具来描述算法,算法的设计一般都应从上述四种基本操作考虑,按解题要求从这些基本操作中选择合适的操作组成解题的操作序列。
②算法的控制结构
一个算法的功能不仅取决于所选用的操作,而且还与各操作之间的执行顺序有关。
算法中各个操作间的执行顺序称为算法的控制结构。
描述算法的工具通常有传统流程图、N-S结构化流程图、算法描述语言等。
一个算法一般都可以用顺序、选择(或称分支)、循环(也称重复)3种基本控制结构组合而成。
4、算法设计的基本方法
①列举法
②归纳法
③递推
④递归
⑤减半递推技术
⑥回溯法
*考点2算法的复杂度重点
算法的复杂度主要包括:
时间复杂度和空间复杂度。
重点
1、算法的时间复杂度重点
算法的时间复杂度:
是指执行算法所需要的计算工作量。
解释:
为了能够比较客观地反映出一个算法的效率,在度量一个算法的工作量时,不仅应该与所使用的计算机、程序设计语言以及程序编制者无关,而且还应该与算法实现过程中的许多细节无关。
因此,可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。
算法的工作量
基本运算反映了算法运算的主要特征,因此,用基本运算的次数来度量算法工作量是客观的也是实际可行的,有利于比较同一问题的几种算法的优劣。
如:
在考虑两个矩阵相乘时,要以将两个实数之间的乘法运算作为基本运算,而对于所用的加、减法运算可以忽略不计。
如:
当需要在一个表中进行查找时,可以将两个元素之间的比较作为基本运算。
算法所执行的基本运算次数还与问题的规模有关。
如:
两个20阶矩阵相乘与两个10阶矩阵相乘,所需要的基本运算(即两个实数的乘法)次数显然是不同的,前者所需要的运算次数更多。
时间复杂度为:
n3
因此,在分析算法的工作量时,还必须对问题的规模进行度量。
综上所述,算法的工作量用算法所执行的基本运算次数来度量,而算法所执行的基本运算次数是问题规模的函数,即:
算法的工作量=O(n)
其中,n是问题的规模。
例如:
两个n阶矩阵相乘所需要的基本运算(即两个实数的乘法)次数为n3,即计算工作量为n3,也就是时间复杂度为O(n3)。
在具体分析一个算法工作量时,还会存在这样的问题:
对于一个固定的规模,算法所执行的基本运算次数还可能与特定的输入有关,而实际上又不可能将所有情况下算法所执行的基本运算次数都列出来。
如:
在长度为n的一维数组中查找值为x的元素。
查找6,25,9
6
2
102
8
-3
0
23
25
若采用顺序搜索法,即从数组的第一个元素开始,逐个与被查值x进行比较。
显然,如果第一个元素恰好为x,则只需要比较1次。
但如果x为数组的最后一个元素,或者x不在数组中,则需要比较n次才能得到结果。
因此,在这个问题的算法中,其基本运算(即比较)的次数与具体的被查值x有关。
在同一问题规模下,如果算法执行所需的基本运算次数取决于某一特定输入时,可以用以下两种方法来分析算法的工作量:
①平均性态重点,记名词及概念即可
平均性态:
用各种特定输入下的基本运算次数的加权平均值来度量算法的工作。
了解
设x是所有可能输入中的某个特定输入,p(x)是x出现的概率(即输入为x的概率),t(x)是算法在输入为x时所执行的基本运算次数,则算法的平均性态定义为:
A(n)=
其中Dn表示当规模为n时,算法执行时所有可能输入的集合。
这个式子中的t(x)可以通过分析算法来加以确定;而p(x)必须由经验或用算法中有关的一些特定信息来确定,通常是不能解析地加以计算的。
如果确定p(x)比较困难,则会给平均性态的分析带来困难。
②最坏情况复杂性重点
最坏情况复杂性:
在规模为n时,算法所执行的基本运算的最大次数。
它的定义为:
W(n)=
显然,W(n)的计算要比A(n)的计算方便得多。
由于W(n)实际上是给出了算法工作量的一个上界,因此,它比A(n)更具有实用价值。
例:
采用顺序搜索法,在长度为n的一维数组中查找值为x的元素。
即从数组的第一个元素开始,逐个与被查值x进行比较。
基本运算为x与数组元素的比较。
解:
平均性态分析。
略
最坏情况分析。
在这个例子中,最坏情况发生在需要查找的x是数组中的最后一个元素或x不在数组中的时候,此时,显然有:
W(n)=max{ti|1≤i≤n+1}=n
2、算法的空间复杂度重点
算法的空间复杂度:
是指执行这个算法所需要的内存空间。
一个算法所占用的存储空间包括程序所占的空间、输入的初始数据所占的存储空间以及算法执行过程中所需要的额外空间。
其中,额外空间包括算法程序执行过程中的工作单元以及某种数据结构所需要的附加存储空间。
如果额外空间相对于问题规模来说是常数,则称该算法是原地(inplace)工作的。
在许多问题中,为了减少算法所占的存储空间,通常采用压缩存储技术,以便尽量减少不必要的额外空间。
二、数据结构的基本概念
利用计算机进行数据处理是计算机应用的一个重要领域。
在进行数据处理时,实际需要处理的数据元素一般有很多,而这些大量的数据元素要存放在计算机中,因此,大量的数据元素在计算机中如何组织,以便提高数据处理的效率,并且节省计算机的存储空间,这是进行数据处理的关键问题。
数据结构作为计算机的一门学科,主要研究和讨论以下
三个方面的问题:
①数据集合中各数据元素之间所固有的逻辑结构,即数据的逻辑结构。
②在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构。
③对各种数据结构进行的运算。
讨论以上问题的主要目的是为了提高数据处理的效率。
提高数据处理的效率,主要包括两个方面:
一是提高数据处理的速度;二是尽量节省在数据处理过程中所占用的计算机存储空间。
考点3什么是数据结构
计算机已经被广泛用于数据处理,实际问题中的各数据元素之间总是相互关联的。
所谓数据处理,是指对数据集合中的各元素以各种方式进行运算,包括插入、删除、查找、更改等运算,也包括对数据元素进行分析。
●数据元素:
在数据处理领域中,每一个需要处理的对象都可以抽象成数据元素。
数据元素一般简称为元素。
●数据对象:
性质相同的数据元素的集合是数据的一个子集。
●数据结构:
数据结构是指相互关联的数据元素的集合,即数据组织形式。
所谓结构,就是指数据元素之间的前后件关系。
数据结构包括两个方面的信息:
一是表示数据元素的信息;
二是表示各数据元素之间的前后件关系。
一般情况下,在具有相同特征的数据元素集合中,各个数据元素之间存在某种关系即联系,这种关系反映了该集合中的数据元素所固有的一种结构。
在数据处理领域中,通常把数据元素之间这种固有的关系简单地用前后件关系(或直接前驱与直接后继来描述)。
如:
描述一年四季的季节名
春、夏、秋、冬
可以作为季节的数据元素。
在考虑一年四个季节的顺序关系时,“春”是“夏”的前件(即直接前驱),而“夏”是“春”的后件(即直接后继);同样,“夏”是“秋”的前件,“秋”是“夏”的后件,等。
如:
表示家庭成员的各成员名:
父亲、儿子、女儿
可以作为家庭成员的数据元素。
1、数据的逻辑结构
前面提到,数据结构是指反映数据元素之间关系的数据元素集合的表示。
它包括两个方面的信息:
一是表示数据元素的信息;
二是表示各数据元素之间的前后件关系。
在以上所述的数据结构中,其中数据元素之间的前后件关系是指它们的逻辑关系,而与它们在计算机中的存储位置无关。
因此,上面所述的数据结构实际上是数据的逻辑结构。
数据的逻辑结构:
是指反映数据元素之间逻辑关系的数据结构。
数据的逻辑结构有两个要素:
一是数据元素的集合,记为D;
二是D上的关系,它反映了D中各数据元素之间的前后件关系,记为R。
即一个数据结构可以表示成:
B=(D,R)
为了反映D中各数据元素之间的前后件关系,一般用二元组来表示。
如:
假设a与b是D中的两个数据,则二元组(a,b)表示a是b的前件,b是a的后件。
这样,在D中的每两个元素之间的关系都可以用这种二元组来表示。
例:
一年四季的数据结构可以表示成:
B=(D,R)
D={春,夏,秋,冬}
R={(春,夏),(夏,秋),(秋,冬)}
例:
家庭成员数据结构可以表示成:
B=(D,R)
D={父亲,儿子,女儿}
R={(父亲,儿子),(父亲,女儿)}
2、数据的存储结构(也称为数据的物理结构)
数据的存储结构(物理结构):
指的是数据的逻辑结构在计算机存储空间中的存放形式。
在进行数据处理时,被处理的各数据元素总是被存放在计算机的存储空间中,而且各数据元素在计算机存储空间中的位置关系与它们的逻辑关系可能不同。
正是因为这一点,为了表示存放在计算机存储空间中的各数据元素之间的逻辑关系(即前后件关系),在数据的存储结构中,不仅要存放各数据元素的信息,还需存放各数据元素之间的前后件关系的信息。
一般来说,一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链式 、索引等存储结构。
而采用不同的存储结构,其数据处理的效率是不同的。
因此,在进行数据处理时,选择合适的存储结构是很重要的。
考点4线性结构的图形表示
一个数据结构除了可用二元关系表示外,还可以直观地用图形来表示。
B=(D,R)二元关系表示
在数据结构的图形表示中,对于数据集合D中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,并简称为结点;为进一步表示各数据元素之间的前后件关系,对于关系R中的每一个二元组,用一条有向线段从前件结点指向后件结点。
在数据结构中,没有前件的结点称为根结点;没有后件的结点称为终端结点(也称为叶子结点);除根结点和叶子结点外,其它的结点称为内部结点。
例如,一年四季的数据结构可以用下图表示。
通常,一个数据结构中的元素结点可能是动态变化的。
根据需要或者在数据结构进行处理的过程中,不仅数据结构中的结点个数在动态地变化,而且各元素之间的关系也有可能动态地变化。
*考点5线性结构与非线性结构重点
如果在一个数据结构中没有一个数据元素,则称该数据结构为空的数据结构。
在一个空的数据结构中插入一个新的元素后就变为非空;在只有一个数据元素的数据结构中,将该元素删除后就变为空的数据结构。
根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类:
线性结构与非线性结构。
重点
如果一个非空的数据结构满足下列两个条件:
①有且只有一个根结点;
②每一个结点最多有一个前件,也最多有一个后件。
则称该数据结构为线性结构。
线性结构又称线性表。
重点
注:
在一个线性结构中插入或删除任何一个结点后还应是线性结构。
春夏秋冬图,就是一个线性结构。
如果一个数据结构不是线性结构,则称之为非线性结构。
下图的家庭成员图,就是一个非线性结构。
线性结构与非线性结构都可以是空的数据结构。
根据具体情况来确定。
三、线性表及其顺序存储结构
考点6线性表的基本概念
线性表是最简单、最常用的一种数据结构。
线性表是一组数据元素组成。
如:
一个n维向量(x1,x2,…,xn)是一个长度为n的线性表,其中的每一个分量就是一个数据元素。
如:
英文小写字母表(a,b,c,…,z)是一个长度为26的线性表,其中每一个小写字母就是一个数据元素。
如:
一年中的四个季节(春,夏,秋,冬)是一个长度为4的线性表,其中的每一个季节名就是一个数据元素。
如:
学生表,每条记录称为一个数据元素。
线性表是由n(n≥0)个数据元素a1,a2,…,an组成的一个有限序列,表中的每一个数据元素,除了第一个外,有且只有一个前件,除了最后一个外,有且只有一个后件。
即线性表或是一个空表,或可以表示为:
(a1,a2,…,ai,…,an)
其中ai(i=1,2,…,n)是属于数据对象的元素,通常也称其为线性表中的一个结点。
显然,线性表是一种线性结构。
数据元素在线性表中的位置只取决于它们自己的序号,即数据元素之间的相对位置是线性的。
非空线性表有如下一些结构特征:
1有且只有一个根结点a1,它无前件;
2有且只有一个终端结点an,它无后件;
3除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。
线性表中结点的个数n称为线性表的长度。
当n=0时,称为空表。
*考点7线性表的顺序存储结构重点
在计算机中存放线性表,一种最简单的方法是顺序存储,也称为顺序分配。
线性表的顺序存储结构具有以下两个基本特点:
重点
1线性表中所有元素所占的存储空间是是连续的;
2线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
因此,线性表的顺序存储结构中,其前后件两个元素在存储空间中是紧邻的,且前件元素一定存储在后件元素的前面。
重点
长度为n的线性表(a1,a2,…,an),在计算机中的顺序存储结构如下图所示。
线性表的顺序存储结构
在用一维数组存放线性表时,该数组的长度通常要定义得比线性表的实际长度大一些。
在一般情况下,如果线性表的长度在处理过程中是动态变化的,则在开辟线性表的存储空间时要考虑到线性表的动态变化过程中可能达到的最大长度。
在线性表的顺序存储结构下,可以对线性表进行各种处理。
主要的运算如下:
8个
●在线性表的指定位置处加入一个新的元素(线性表的插入)。
●在线性表中删除指定位置处的数据元素(线性表的删除)。
●在线性表中查找某个(或某些)特定的元素(线性表的查找)。
●对线性表中的元素进行排序(线性表的排序)。
●按要求将一个线性表分解成多个线性表(线性表的分解)。
●按要求将多个线性表合并成一个线性表(线性表的合并)。
●复制一个线性表(线性表的复制)。
●逆转一个线性表(线性表的逆转)等。
考点8线性表的插入运算
首先分析,插入元素时,线性表的逻辑结构发生什么变化?
在一般情况下,要在第i(1≤i≤n)个元素之前插入一个新元素时,首先要从最后一个(即第n个)元素开始,直到第i个元素之间共n-i+1个元素依次向后移动一个位置,移动结束后,第i个位置就被空出,然后将新元素插入到第i项。
插入结束后,线性表的长度就增加了1。
显然,在线性表采用顺序存储结构时,
如果插入运算在线性表的末尾,即在第n个元素之后(可以认为在第n+1个元素之前)插入新元素,则只要在表的末尾增加一个元素即可,不需要移动表中的元素;
如果要在线性表的第1个元素之前插入一个新元素,则需要移动表中所有的元素。
在平均情况下,要在线性表中插入一个新元素,需要移动表中一半的元素。
因此,在线性表顺序存储的情况下,要插入一个新元素,其效率是很低的,特别是在线性表比较大的情况下更为突出,由于数据元素的移动而消耗较多的处理时间。
插入操作的时间复杂度为:
n
也有记为:
O(n)
注意,上溢。
例:
图1为一个长图为8的线性表顺序存储在长度为10的存储空间中。
现在要求在第2个元素(即18)之前插入一个新元素87,其插入过程:
略。
插入一个新元素后,线性表的长度变为9。
(V(1:
10)表示一维数组的存储空间)
V(1:
10)V(1:
10)
图1插入后
如果再要在线性表的第9个元素之前插入一个新元素14,则采用类似的方法:
略。
插入后,线性表的长度变成了10。
如下图所示。
此时,不能再插入了。
V(1:
10)V(1:
10)
考点9线性表的删除运算
删除元素时,线性表的逻辑结构发生什么变化?
在一般情况下,要删除第i(1≤i≤n)个元素时,则要从第i+1个元素开始,直到第n个元素之间共n-i个元素依次向前移动一个位置。
删除结束后,线性表的长度就减少了1。
例:
图2为一个长度为8的一线性表顺序存储在长度为10的存储空间中。
删除线性表中的第1个元素:
删除线性表中的第6个元素:
显然,在线性表采用顺序存储结构时,
如果删除运算在线性表的末尾,即删除第n个元素,则不需要移动表中元素;
如果要删除线性表的第1个元素,则需要移动表中所有的元素。
在平均情况下,要在线性表中删除一个元素,需要移动表中一半的元素。
因此,在线性表顺序存储的情况下,要删除一个元素,其效率是很低的,特别是在线性表比较大的情况下更为突出,由于数据元素的移动而消耗较多的处理时间。
删除操作的时间复杂度为:
n
O(n)
由线性表在顺序存储结构下的插入与删除运算可以看出,线性表的顺序存储结构对于小线性表或者其中元素不常变动的线性表来说是合适的,因为顺序存储的结构比较简单。
但这种顺序存储方式对于元素经常需要变动的大线性表就不太合适了。
因为插入与删除的效率比较低。
其时间复杂度均为n。
四、栈和队列
*考点10栈及其基本运算重点
1.栈的定义
栈(stack)实际上也是线性表,只不过是一种特殊的线性表。
其插入和删除运算都只能在表的一端进行。
栈是限定在一端进行插入和删除的线性表。
课件演示:
栈的基本概念.ppt
在栈中,允许插入与删除的一端称为栈顶,而不允许插入与操作的另一端称为栈底,当表中没有元素时称为空栈。
栈顶元素总是最后被插入的元素,也是最早被删除的元素;栈底元素是最早被插入的元素,也是最晚被删除的元素。
即栈的修改原则是先进后出(firstinlastout,FILO)或后进先出(lastinfirstout,LIFO)。
通常,用指针top来指示栈顶的位置,用指针bottom来指示栈底的位置。
2.栈的顺序存储及运算
与一般的线性表一样,在程序设计语言中,用一维数组S(1:
m)作为栈的顺序存储空间,其中m为栈的最大容量。
通常,栈底指针指向栈空间的低地址一端(即数组的起始地址这一端)。
如下图a所示为容量为10的栈顺序存储空间,栈中已有6个元素;图b与图c分别为入栈与退栈后的状态。
栈的运算有3种:
入栈、退栈与读栈顶元素。
①入栈运算
入栈运算是指在栈顶位置插入一个新元素。
此运算有两个基本操作:
首先将栈顶指针进1(即top加1),然后将新元素插入到栈顶指针指向的位置。
当栈顶指针已经指向存储空间的最后一个位置时,说明栈空间已满,不可能再进行入栈操作。
这种情况称为栈“上溢”错误。
②退栈运算
退栈是指取出栈顶元素并赋给一个指定的变量。
此运算有两个基本操作:
首先将栈顶元素(栈顶指针指向的元素)赋予一个指定的变量,然后将栈顶指针退1(即top减1)
当栈顶指针为0时,说明栈空,不可能再进行退栈操作。
这种情况称为栈“下溢”错误。
③读栈顶元素
读栈顶元素是指将栈顶元素赋给一个指定的变量。
必须注意,此运算不删除栈顶元素,只是将其赋给一个变量,因此在这个运算中,栈顶指针不会改变。
当栈顶指针为0时,说明栈空,读不到栈顶元素。
课件演示:
入栈与退栈操作.ppt
*考点11队列及其基本运算重点
1.队列的定义
队列(queue)是指允许在一端进行插入、而在另一端进行删除的线性表。
允许插入的一端称为队尾,通常用一个称为尾指针(rear)的指针指向队尾,即尾指针总是指向最后被插入的元素;
允许删除的一端称为排头(也称队头),通常也用一个排头指针(front)指向排头元素的前一个位置。
队列又称为“先进先出”(firstinfirstout,FIFO)或“后进后出”(lastinlastout,LILO)的线性表,它体现了“先来先服务”的原则。
在队列中,队尾指针与排头指针共同反映了队列中元素动态变化的情况。
当队列中没有元素时称为空队列。
下图为具有6个元素的队列示意图。
往队列的队尾插入一个元素称为入队运算,从队列的排头删除一个元素称为退队运算。
下图为入队、退队运算示意图。
2.循环队列及其运算重点
在实际应用中,队列的顺序存储结构一般采用循环队列的形式。
所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用,
长度s=0表示队列空,s=m且front=rear表示队列满
其它内容不再介绍了
五、线性链表
*考点12线性链表的基本概念重点
在链式存储结构中,要求每个结点由两部分组成:
一部分是用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。
其中,指针用于指向该结点的前一个或后一个结点(即前件或后件)。
在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
链式存储方式既可用于表示线性结构,也可用于表示非线
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机二级 公共基础知识第1章 数据结构与算法 计算机 二级 公共 基础知识 数据结构 算法