一:基本概念
1.1 数据结构
是一门研究非数值计算(描述非数值计算问题的数学模型不是数学方程,而是诸如表、树和图之类的具有逻辑关系的学科)的程序设计中计算机的操作对象以及他们之间的关系和操作的学科
1.2 基本概念和术语
1.2.1:概念
数据(Data)可以输入计算机并且能被计算机处理的各种符号的集合
-信息的载体
-是对客观事物符号化的表示
-能够被计算机识别、存储和加工
-包括
-数值型的数据:整数、实数
-非数值型的数据:文字、图像、图形、声音等
数据元素(Data Element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
-简称为元素、或称为记录、结点或顶点
-一个数据元素可由若干个数据项(构成数据元素不可分割的最小单位(用于描述数据元素))组成
-三者之间的关系:数据>数据元素>数据项
eg:学生表>个人记录>学号、姓名...
数据对象(Data Object)是性质相同的数据元素的集合,是数据的一个子集
数据结构(Data Structure)
-数据元素不是孤立存在的,他们之间存在着某种关系,数据元素相互之间的关系称为结构
-是指相互之间存在的一种或多种特定关系的数据元素集合
-或者说,数据结构是带结构的数据元素的集合
内容
-数据元素之间的逻辑关系,称为逻辑结构
-数据元素及其关系在计算机内存中的表示(又称为映像),称为数据的物理结构或数据的存储结构
-数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现
1.2.2:数据结构的两个层次
(1)逻辑结构(人认为的在数据元素之间存在的逻辑关系)
-描述数据元素之间的逻辑关系
-与数据的存储无关,独立于计算机
-是从具体问题抽象出来的数学模型
(2)物理结构(存储结构)
-数据元素及其关系在计算机存储器中的结构(存储方式)
-是数据结构在计算机中的表示
(3)两者之间的关系
-存储结构是逻辑结构的映像与元素本身的映像
-逻辑结构是数据结构的抽象,存储结构是数据结构的实现
-两者综合起来建立了数据元素之间的结构关系
-同一种逻辑结构可以表现为不同的存储结构
(4)数据运算:施加在该数据上的操作
1.2.3:逻辑结构的种类
划分方法一
(1)线性结构(一对一)
有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋元素和一个直接后继元素
eg:线性表、栈、队列、串
(2)非线性结构(一对多)
一个结点可能有多个直接前趋元素和直接后继元素;开始元素唯一,终端元素不唯一
eg:树、图
划分方法二(四种基本逻辑结构)
集合结构:结构中的数据元素除了同属于一个集合的关系外,无其它任何关系
线性结构:结构中的数据元素之间存在着一一对应的线性关系
树状结构:结构中的数据元素之间存在着一对多的层次关系
图状结构或网状结构:结构中的数据元素之间存在着多对多的任意关系
1.2.4:存储结构的种类
(1)顺序存储结构
-用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示
-C语言中用数组(数组不是一组数,而是内存当中一组连续的存储单元)来实现顺序存储结构
(2)链式存储结构
-用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示
-C语言中用指针来表示链式存储结构
(3)索引存储结构
-在存储结点信息的同时,还建立附加的索引表
-索引表中的每一项称为一个索引项
-索引项的一般形式是:(关键字,地址)
-关键字是能唯一标识一个结点的那些数据项
(4)散列存储结构
-根据结点的关键字直接计算出该结点的存储地址
1.3 数据类型和抽象数据类型
高级语言中的数据类型明显地或隐含地规定了在程序执行期间变量和表达的所有可能的取值范围,以及在这些范围上所允许进行的操作
1.3.1: 数据类型
数据类型(Data Type):一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称
数据类型=值的集合+值集合上的一组操作
数据类型的作用:
①约束变量或常量的取值范围
②约束变量或常量的操作
1.3.2 :抽象数据类型
抽象数据类型(ADT:Abstract Data Type):一个数学模型以及定义在此数学模型上的一组操作
-由用户定义,从问题抽象出数据模型(逻辑结构)
-还包括定义在数据模型上的一组抽象运算(相关操作)
-不考虑计算机内的具体存储结构和运算的具体实现算法
抽象数据类型的形式定义
抽象数据类型可用(D,S,P)三元组表示
-其中:D是数据对象
S是D上的关系集
P是对D的基本操作集
定义格式:
ADT 抽象数据类型
{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
其中:
-数据对象、数据关系的定义用伪代码描述
-基本操作的定义格式为:
*基本操作名(参数表)//赋值参数:只为操作提供输入值;引用参数:以&打头,除可提供输入值外,还将返回操作结果
*初始条件(初始条件描述)//描述操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。若初始条件为空,则省略之
*操作结果(操作结果描述)//说明操作正常完成之后,数据结构的变化状况和应该返回的结果
eg:Circle的定义
ADT Circle
{
数据对象:D={r,x,y|r,x,y均为实数}
数据关系:R={<r,x,y>|r是半径,<x,y>是圆心坐标}
基本操作:
Circle(&C,r,x,y)
操作结果:构造一个圆
double Area(C)
初始条件:圆已存在
操作结果:计算面积
double Circumference(C)
初始条件:圆已存在
操作结果:计算周长
......
}ADT Circle
1.4 算法
1.4.1:算法定义
算法:对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每一个指令表示一个或多个操作(用计算机来解决某个具体问题的步骤或过程)
算法特征:
(1)有穷性:在有穷步之后结束,算法可以停机
(2)确定性:无二义性
(3)可行性:算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现
(4)输入:0个或多个输入
(5)输出:1个或多个输出
算法设计的要求:
正确性(Correctness):算法满足问题要求,能正确解决问题
可读性(Readability) :易于人的阅读和交流
健壮性(Robustness) :当输入非法数据时,算法恰当的做出反应或进行相应的处理,而不是产生莫名其妙的输出结果
高效性(Efficiency):要求花费尽可能少的时间和尽量低的存储需求
算法与程序的区别:
程序:用某种程序设计语言对算法的具体实现
算法:解决问题的一种方法或一个过程,考虑如何将输入转化成输出,一个问题可以有多种算法
1.4.2:算法描述
①输入—算法—输出
返回值 算法对应的函数名(形参列表)`
{ //临时变量的定义
//实现由输入参数到输出参数的操作
...
}
返回值:通常为bool(逻辑)类型,表示算法是否成功执行
形参列表:由输入型参数(算法输入)(已知值)和输出型参数(算法输出)(运算后的结果)构成
1.4.3:算法分析
算法时间效率的度量
-算法时间效率可以依据该算法编制的程序在计算机上执行所消耗的时间来度量
度量方法:
(1)事后分析
将算法实现,测算其时间和空间开销
缺点:编写程序实现算法将花费较多的时间和精力,所得实验结果依赖于计算机的软硬件等环境因素,掩盖算法本身的优劣
(2)事前分析
对算法所消耗资源的一种估算方法
一个算法的执行时间是指一个算法在计算机上运行所耗费的时间;
大致可以等于计算机执行一种简单的操作(如赋值、比较、移动等)所需的时间与算法中进行的简单操作的次数乘积
算法运行时间=一个简单操作所需的时间*简单操作次数(即算法中每条语句的执行时间之和)
算法运行时间=∑每条语句的执行次数乘该语句执行一次所需的时间 //语句的执行次数又称为语句频度
1.4.4:时间复杂度
若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度
一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作的执行次数,它是问题规模n的某个函数,用T(n)表示
分析算法时间复杂度的基本方法
(1)找出语句频度最大的那条语句作为基本语句
(2)计算基本语句的频度得到问题规模n的某个函数f(n)
(3)取其数量级用符号“O”表示
注:时间复杂度是由嵌套最深层语句的频度决定的
有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同
最坏时间复杂度:指在最坏情况下,算法的时间复杂度
平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间
最好时间复杂度:只在最好情况下,算法的时间复杂度
1.4.5:算法时间效率的比较
按数量级递增顺序为(复杂度由高至低):
O(1)<O(㏒₂ⁿ)<O(n)<O(n㏒₂ⁿ)<O(n²)<O(n³)<O(...)<O(2ⁿ)
1.4.6:空间复杂度
-空间复杂度:算法所需存储空间的度量
记作:S(n)=O(f(n)) 其中n为问题的规模(或大小)
-算法要占据的空间
①算法本身要占据的空间,输入/输出,指令,常数,变量等
②算法要使用的辅助空间