数据结构基本概念
不了解施加于数据上的算法就无法决定如何构造数据,反之,算法的结构和选择却常常在很大程度上依赖于作为基础的数据结构。 —— C.A.R Hoare
数据结构是计算机存储、组织数据的方式,是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。
数据结构相关术语
数据(data)
数据指所有能输入到计算机中并被计算机程序处理的符号的总称。
数据是信息在计算机程序中的表示形式或编码形式,是描述客观事物的数、字符以及所有能输入到计算机中并被计算机程序识别和处理的符号合集。
数据可分为两类,一类是数值数据,包括整数、浮点数、复数和双精度数等;另一类是非数值数据,主要包括字符和字符串,以及文字图形,图像和语音等。
数据元素(data element)
如果把数据作为一个集合,则集合中的每一个独立“个体”称为数据元素。数据元素是组成基本单位。
数据元素具有完整确定的实际意义。
例,图中的一个“圆圈”、表中的“一行”等。
数据项(data item)
数据元素可以由若干数据项构成。数据项是组成数据的不可分割的最小单位,具有独立含义。
例,一本书的数目信息为一个数据元素,而数目信息中的每一项(如书名、作者名等)为一个数据项。
数据对象(data object)
数据对象是性质相同的数据元素的集合,是一个数据的子集。
例,整数数据对象集合,字母字符数据对象集合。
数据结构(data structure)
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
数据结构是一个二元组:Data_Structure = (D,S)
其中,D是数据元素的有限集,S是D上关系的有限集。
- 逻辑结构:数据元素间的逻辑关系
- 存储结构:数据在计算机中的表示形式
- 运算:在数据上执行的操作
数据的逻辑结构
数据的逻辑结构与存储无关。
四类基本逻辑结构:
- 集合
- 线性结构(1:1)
- 树形结构(1:n)
- 图状结构或网状结构(m:n)
三类基本逻辑结构:
线性结构、树形结构、图状结构
两类基本逻辑结构:
- 线性结构
- 线性表
- 栈
- 串
- 数组
- 非线性结构
- 树
- 图
数据的存储结构
数据的物理结构,又称存储结构,依赖于计算机,包括数据元素的表示和关系的表示。
- 顺序结构
- 链式结构
- 索引结构
- 散列结构
数据的运算
- 插入
- 删除
- 修改
- 查找
- 排序
数据类型(data type)
数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
例,C语言中的整型变量,其值集为某个区间上的整数,定义在其上的操作为加、减、乘、除和取余等算术运算。
按“值”的不同特性,高级程序语言中的数据类型可分为两类:
- 非结构的原子类型
- 结构类型
抽象数据类型(abstract data type,简称ADT)
抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。
抽象数据类型和数据类型实质上是一个概念。ADT的特征是使用与实现分离,实行封装和信息隐蔽。
例,各个计算机都拥有“整数”类型,是一个ADT,尽管它们在不同处理器上实现的方法可以不同,由于其定义的数学特性相同,在用户看来都是相同的。
按“值”的不同特性,可分为三类:
- 原子类型
- 固定聚合类型
- 可变聚合类型
抽象数据类型是一个三元组:ADT = (D,S,P)
其中,D是数据对象,S是D上的关系集,P是对D的基本操作。
格式:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
ADT可以同个固有的数据类型来表示和实现。类似于C中的struct,但增加了相关的服务。
算法(algorithm)
算法是一系列输入转化为输出的计算步骤。
算法的特性
- 有穷性
在执行有穷步之后结束,且每一步都可在有穷时间内完成。 - 确定性
不会产生二义性,只有唯一的一条执行路径。 - 可行性
- 输入
零个或多个输入。 - 输出
一个或多个输出。
一个好的算法
- 正确性
- 可读性
- 健壮性
- 效率与低存储要求
算法评价的指标
- 运行时间(时间复杂度)
- 占用空间(空间复杂度)
- 正确性
- 简单性
时间复杂度
算法的渐进时间复杂度(asymptotic time complexity),简称时间复杂度,由嵌套最深的语句的频度决定。
T(n) = O(f(n))
语句的频度(frequency count)指该语句重复执行的次数。
O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2)
空间复杂度
S(n) = O(f(n))