1. 基本概念和术语
数据(data)是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称;
数据元素(data element)是数据的基本单位;一个数据元素可以由若干个数据项(data item)组成;
数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集。
数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合;这种数据元素相互之间的关系称为结构(structure):
逻辑结构
- 集合
- 线性结构:一对一
- 树形结构:一对多
- 图状结构或网状结构:多对多
数据结构的形式定义为:数据结构是一个二元组
Data_Structure = ( D , S )
其中:D是数据元素的有限集,S是D上关系的有限集。
存储结构
数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构
在计算机中表示信息的最小单位是二进制数的一位叫做位(bit);可以用一个由若干位组合起来形成的一个位串表示一个数据元素,通常称这个位串为元素(element)或结点(node)。当数据元素由若干数据项组成是,位串中对应与各个数据项的子位串称为数据域(data field)。因此,元素或结点课看成是数据元素在计算机中的映像。
数据元素之间的关系在计算机中有两种不同的表示方法:
顺序映像 非顺序映像,由此得到两种不同的存储结构:顺序存储结构 链式存储结构
顺序映像的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系;
非顺序映像的特点是借助指示元素存储地址的指针(pointer)表示数据元素之间的逻辑关系。
算法的实际取决于选定的数据(逻辑)结构,而算法的实现依赖于采用的存储结构。
由于讨论的存储结构是数据结构在C虚拟处理器中的表示,因此称它为虚拟存储结构。
数据类型(data type)用以刻画(程序)操作对象的特性,是一个值的集合和定义在这个值集上的一组操作的总称。
数据类型可分为两类:一类是非结构的原子类型,不可分解。
一类是结构类型,由若干成分按某种结构组成的,是可分解的。
抽象数据类型(abstract data type,简称 ADT)是指一个数学模型以及定义在该模型上的一组操作。若按其值的不同特性,可分为下列类型:
- 原子类型(atomic data type)变量的值是不可分解的。
- 固定聚合类型(fixed-aggregate data type)其值由确定数目的成分按某种结构组成
- 可变聚合类型(variable-aggregate data type)构成可变类型“值”的成分的数目不确定。
后两者可以统称为结构类型。
相对于数据结构,抽象数据类型可以用一下三元组表示:
(D , S , P)
其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。
本书采用以下格式定义抽象数据类型:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为:
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
基本操作有两种参数: 赋值参数只为操作提供输入值; 引用参数以&打头,除可提供输入值外,还将返回操作结果
多形数据类型( polymorphic data type )是指其值的成分不确定的数据类型。
2. 抽象数据类型的表示与实现
3.算法和算法分析
算法
算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列, 其中每一条指令表示一个或多个操作
算法具有以下五个特性:
- 有穷性: 执行有穷步后结束,且每一步都可在有穷时间内完成
- 确定性: 唯一的一条执行路径
- 可行性: 算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的
- 输入: 有0个或多个输入
- 输出: 有一个或多个输出
算法设计的要求:
- 正确性(correctness): a. 程序不含语法错误 b. 程序对于几组输入数据能够得出满足规格说明要求的结果 c. 对于精心选择的典型苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果 d. 程序对于一切合法的输入数据都能够产生满足规格说明要求的结果
- 可读性(readability)
- 健壮性(robustness): 当输入数据非法是,算法也能适当地作出反应或进行处理, 而不会产生莫名其妙的输出结果
- 效率与低存储量需求: 效率指的是算法执行的时间
算法效率的度量
(1) 事后统计的方法
(2) 事前分析估算的方法
一般情况下,算法中基本操作重复执行的次数是问题规模 n 的某个函数 f(n) , 算法的时间度量记作:
它表示随时间规模 n 的增大,算法执行的时间增长率和 f(n) 的增长率相同, 称做算法的渐近时间复杂度(asymptomatic time complexity), 简称时间复杂度
语句的频度(frequency count)指的是该语句重复执行的次数
常见的渐近时间复杂度有:
算法的存储空间需求
类似于算法的时间复杂度,以空间复杂度(space complextiry)作为算法所需存储空间的度量,记作:
其中 n 为问题的规模
若格外空间相对于输入数据量来说是常数,则称此算法为原地工作,即O(1).