数据结构
数据结构是一门研究非数值计算的程序设计问题中的计算机的操作对象以及它们之间的关系和操作等的学科。
基本概念
- data:对客观事物的符号表示
- 数据元素(data element):数据的基本单位,可由若干数据项组成
- 数据项(data item):数据不可分割的最小单位
- 数据对象(data object):性质相同的数据元素的集合,是data的一个子集
- 数据结构(data structure):相互之间存在一种或多种特定关系的数据元素的集合。 形式定义:数据结构是一个二元组,D 是数据元素的有限集,S是D上关系(逻辑关系)的有限集
Data Structure=(D,S)
-
4种基本结构:
- 集合:其中的元素除了同属一个集合没其他关系
- 线性结构:一对一
- 树形结构:一对多
- 图状或网状结构:多对多
-
数据结构在计算机中的表示(又称为映像)称为数据的物理结构,又叫存储结构。它包括数据元素的表示和关系的表示。可以使用一个由若干位组合起来形成一个位串表示一个数据元素,通常称这个位串为元素或节点(element or node)。当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域(data field)。因此,元素和结点可以看成是数据元素在计算机中的映像。
-
数据元素之间的关系在计算机中有两种不同的表示方式:顺序映像和非顺序映像,由此得到两种不同的存储结构:顺序存储结构和链式存储结构。顺序映像的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。非顺序映像的特点是借助指示元素存储地址的指针(pointer)表示数据元素之间的逻辑关系。
-
算法的设计依赖于选定的数据(逻辑)结构,算法的实现依赖于采用的存储结构。
-
数据类型 (data type):是一个值的集合和定义在这个值集上的一组操作的总称。
-
按照“值”的特性,数据类型分为:非结构的原子类型(值不可分解)和结构类型(其值是由若干成分按照某种结构组成的,可以分解的,并且他的成分可以是结构的或是非结构的)
-
抽象数据类型Abstract data type 即ADT是指一个数学模型以及定义在该模型上的一组操作。定义仅取决于它的一组逻辑特性,与其在计算机内部如何实现无关。“抽象”意义在于数据类型的数学抽象特性。
- 原子类型:属于原子类型的变量的值是不可分解的
- 固定聚合类型:由确定数目的成分按照某种结构组成
- 可变聚合类型:相比于固定聚合类型值的成分数目不确定
ADT形式定义:(D,S,P);D是数据对象,S是D上关系集,P是对D的基本操作集。
ADT抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT抽象数据类型名
//其中数据对象和数据关系的定义用伪码描述
基本操作名(参数表)
初始条件:<初始条件描述>//描述了操作执行之前数据结构和参数应满足的条件
操作结果:<操作结果描述>//操作正常完成后,数据结构的变化状况和应返回的结果
基本操作有两种参数:赋值参数只为操作提供输入值;引用参数以&打头,除提供输入值之外,还将返回操作结果。
13. 多形数据类型(polymorphic data type):是指值的成分不确定的数据类型
抽象数据类型
- 本书预定义的常量和类型
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态码
typedef int Status;
- 数据结构表示(存储结构)用类型定义(typedef)描述,数据元素类型约定为ElemType,由用户在使用该数据类型时自行定义。
- 基本操作算法由以下形式函数描述
函数类型 函数名 (函数参数表){
//算法说明
语句序列
}//函数名
//以&打头的参数即为引用参数
- 基本函数
max(表达式1,表达式2,...,表达式n);//最大值
min(表达式1,表达式2,...,表达式n);//最小值
abs(表达式);//绝对值
floor(表达式);//不足整数值
ceil(表达式);//进位整数值
eof(文件变量)或eof;//判定文件结束
eoln(文件变量)或eoln//判定行结束
- 逻辑运算
&&与运算:对A&&B,当A为0,不再对B求值
||或运算:对A||B,当A非0,不再对B求值
算法和算法分析
- 算法:对特定问题求解步骤的一种描述,是指令的有限序列,每个指令表示一个或多个操作
- 有穷性
- 确定性
- 可行性
- 输入
- 输出
- 算法设计要求:正确性,可读性readability,健壮性robustness,效率与低存储量需求
- 算法效率的度量:算法执行时间需通过依据该算法编制的程序在计算机上的运行时所消耗的时间来度量。
- 事后统计
- 事前分析估算:取决于算法的策略、问题的规模、书写的语言、编译程序产生机器代码的质量,机器执行指令的速度。
- 由于同一算法在不同语言、不同编译程序、不同计算机上效率均有差异,所以认为一个特定算法“运行工作量”的大小只依赖与问题的规模,即是问题规模的函数。
算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作:
T(n) = O(f(n))
随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度(asympototic time cpmplexity),简称时间复杂度。语句的频度(frequency count)是语句重复执行的次数。
- 算法的存储空间要求:空间复杂度作为算法所需存储空间的度量
S(n) = O(f(n))
n为问题规模,一个程序处理需要存储空间来寄存本身所用指令、常量、变量、输入数据之外,也需一些对数据进行操作的工作单元和存储一些为实现计算所需的辅助空间。