1.1数据结构的研究内容
计算机解决问题的步骤
具体问题抽象为数学模型 ——> 设计算法 ——> 编程、调试、运行
抽象为数学模型的实质:
<1> 分析问题
<2> 提取操作对象
<3> 找出操作对象之间的关系
<4> 用数学语言描述 ==> 数据结构
对于“非数值计算”的程序设计问题,其数学模型不是数学方程,而是诸如表、图、和树之类的具有逻辑关系的数据。
数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。
1.2基本概念和术语
数据 是能输入计算机且能被计算机处理的各种符号的集合。
- 信息的载体
- 是对客观事物符号化的表示
- 能够被计算机识别、存储和加工
包括:数值型数据(整数、实数等)和非数值型数据(文字、图像、图形、声音等)
数据元素 数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。也简称为元素、数据、结点或顶点。
- 一个数据元素可由若干个数据项组成。
- 数据项 构成数据元素的不可分割的最小单位。
数据对象 是性质相同的数据元素的集合,是数据的一个子集。
数据结构 数据元素不是孤立存在的,它们之间存在着某种关系,数据元素相互之间的关系称为结构
- 是指相互之间存在一种或多种特定关系的数据元素集合
- 或者说,数据结构是带结构的数据元素的集合
数据结构包括以下三方面内容:
<1> 数据元素之间的逻辑关系,也称为逻辑结构。
- 逻辑结构
- 描述数据元素之间的逻辑关系
- 与数据的存储无关,独立于计算机
- 是从具体问题抽象出来的数学模型
种类:
线性结构:有且仅有一个开始和一个终端节点,并且所有结点都最多只有一个直接前趋和一个直接后继。如:线性表、栈、队列、串- 非线性结构:一个节点可能有多个直接前趋和直接后继。如:树、图
集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其他关系。
线性结构:结构中的数据元素之间存在着一对一的线性关系。
树形结构:结构中的数据元素之间存在着一对多的层次关系。
图状结构(或网状结构):结构中的数据元素之间存在着多对多的任意关系。
<2> 数据元素及其关系在计算机内存中的表示(又称映像),成为数据的物理结构或数据的存储结构。
- 物理结构(存储结构)
- 数据元素及其关系在计算机存储器中的结构(存储方式)
- 是数据结构在计算机中的表示
种类:
- 顺序存储结构:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。如:数组
- 链式存储结构:用一组任意的存储单元依次存储数据元素,数据元素之间的逻辑关系用指针来表示。(存储元素的同时存储下一个元素的地址)
- 索引存储结构:在存储结点信息的同时,还建立附加的索引表。
- 散列存储结构:根据结点的关键字直接计算出该节点的存储地址。
<3> 数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。
- 逻辑结构与存储结构的关系
- 存储结构是逻辑关系的映像与元素本身的映像
- 逻辑结构是数据结构的抽象,存储结构是数据结构的实现
- 两者综合起来建立了数据元素之间的结构关系
数据类型 一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称
- 在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型
- 例如C语言中:基本数据类型;数组、结构、共用体、枚举等构造数据类型;指针、空类型;用typedef自己定义数据类型
- 一些最基本数据结构可以用数据类型来实现,如数组、字符串等
- 另一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示
抽象数据类型 指一个数学模型以及定义在此数学模型上的一组操作
- 形式定义:可用(D,S,P)三元组表示,D是数据对象,S是D上的关系集,P是对D的基本操作集
- 定义格式:其中数据对象、数据关系的定义用伪代码描述
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
基本操作的定义格式:
基本操作名(参数表——>赋值参数,只为参数提供输入值;引用参数,以&打头,除可提供输入值外还将返回操作结果)
初始条件:(初始条件描述)
操作结果:(操作结果描述)
1.3算法和算法分析
算法 对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作
算法特性:
- 有穷性
- 确定性
- 可行性
- 输入:0个或多个输入
- 输出:一个或多个输出
算法效率从以下两方面来考虑:
<1> 时间效率:指算法所耗费的时间
两种度量方法:
1.事后统计
- 将算法实现,测算其时间和空间的开销
2.事前分析
- 对算法所消耗资源的一种估算方法
- 一个算法的运行时间是指一个算法在计算机上运行所耗费的时间大致可以等于计算机执行一种简单操作(如赋值、比较、移动等)所需的时间与算法中进行的简单操作次数的乘积
- 算法运行时间T(n) =
每条语句频度 * 该语句执行一次所需的时间(单位时间)
- 若有某个辅助函数f(n),使得当n趋于无穷大时,T(n)/f(n)的极限值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级符号),简称时间复杂度
- 定理1:若f(n)=
+……+
是m次多项式,则T(n)=O(
)
- 例:分析以下程序段的时间复杂度
i=1; //语句1 while(i<=n) i=i*2; //语句2 //若循环执行1次:i=2 //若循环执行2次:i=2^2 //若循环执行3次:i=2^3 //若循环执行x次:i=2^x //i<=n,则2^x<=n,则x<=log2n,取最大值 //该程序段的时间复杂度T(n)=O(log2n)
对于复杂的算法,可以将它分成几个容易估算的部分,然后利用加法规则和惩罚规则计算时间复杂度
a) 加法规则 T(n) = T1(n)+T2(n) = O(f(n))+O(g(n)) = O(max(f(n),g(n)))
b) 乘法规则 T(n) = T1(n)*T2(n) = O(f(n))*O(g(n)) = O(f(n)*g(n))
<2> 空间效率:指算法执行过程中所耗费的存储空间
空间复杂度:S(n) = O(f(n)) ,其中n为问题的规模
算法要占据的空间:
- 算法本身要占据的空间,输入/输出,指令,常数,变量等
- 算法要使用的辅助空间
两者有时候矛盾