1.1 什么是数据结构
- 用计算机解决实际问题的一般步骤是:
- 建立数学模型
- 确定数学模型上的基本运算
- 数学模型的实现和基本运算的实现
- 算法与算法实现
- 总结:解决实际问题一般有以下四个步骤
- 建立数学模型(问题的逻辑结构)
- 建立在这种数学模型上的基本运算
- 数学模型在计算机上的存储和基本运算在对应存储结构上的实现(问题的存储结构)
- 这种数学模型的基本算法的实现
- 数据结构的逻辑结构有三种:
- 线性结构
- 树形结构
- 图形结构
- 数据结构的定义:
- 数据结构:数据结构是相互之间存在一种或者多种特定关系的数据元素的集合。
- 数据结构:数据结构是数据元素及其之间相互关系的数学描述。
- 什么是数据结构只需要记住两点:数据元素和关系。
- 数据结构的重要性
PASCAL之父,瑞士著名计算机科学家沃思(Niklaus Wirth)教授曾提出程序设计 = 数据结构 + 算法 ,由此可见数据结构的重要性。
1.2 基本概念和术语
- 数据
数据是用于描述客观事物的符号表示,在计算机科学中指一切可以输入到计算机中的并由计算机程序处理的符号的集合。
- 数据元素
数据的基本单位是数据元素,通常作为一个整体考虑。一般由若干数据项组成。
- 数据项
数据项是数据的不可分割的最小单位,一个数据元素可以由若干数据项组成。数据项有时称为域或者字段。
- 数据对象
性质相同的数据元素的集合叫做数据对象,是数据的一个子集。
- 数据结构
数据结构指的是数据元素之间的抽象的相互关系,是数据元素及其相互间的关系的数学描述。
- 数据结构四种基本结构
- 集合
- 线性结构
- 树型结构
- 图状结构
- 数据结构的形式定义:
- data structure=(D,S)
- D是数据无序的集合
- S是D上的关系的集合
- 数据结构
数据结构指的是数据元素之间的抽象的相互关系,是数据元素及其相互关系的数学描述。每一种数据结构分为:逻辑结构和存储结构。
- 存储结构(物理结构)
数据结构包括数据元素和他们之间的关系。
- 顺序存储结构
- 链接存储结构
- 索引存储结构
- 散列存储结构
- 数据类型
数据类型是一个值的集合和定义在这个集合上的一组操作的总称。分为原子数据类型和结构数据类型。
1.3 抽象数据类型的表示和实现
- 抽象数据类型的定义
- 抽象数据类型是指一个数学模型和定义在这个数学模型上的一组操作。
- 抽象数据类型的形式定义
抽象数据类型的形式定义可用三元组表示:(D,S,P)
D是数据对象,S是D上的关系集,P是对D的基本操作集。数据结构与抽象数据类型的关系?
数据结构是抽象数据型中的数学模型,抽象数据型是数据结构加上一组操作。ADT描述方式
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT抽象数据类型名
- 抽象数据类型的表示与实现
抽象数据型的表示和实现包括数据模型的表示和实现和在其上定义的各种操作的表示和实现。
(1) 预定义常量和类型
#define TRUE 1
#define FALSE 0
#define Ok 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
(2) 数据结构的表示(存储结构)用类型定义(typedef)描述,数据元素类型约定为ElemType,由用户使用该数据类型时自行定义。
(3) 基本操作的算法都用以下形式的函数描述:
函数类型 函数名(参数表){
//算法说明
语句序列
}//函数名
(4) 赋值语句有:
成组赋值
(变量名1,…,变量名k)=(表达式1,…,表达式k);
变量名[起始下标…终止下标]
=变量名[起始下标…终止下标]
交换赋值 变量名←→变量名
(5) 选择语句有:
if…else
switch
(6) 循环语句有:
for
while
do while
(7) 结束语句有:
return
break
exit
(8) 输入输出
scanf
printf
(9) 基本函数有
max(表达式1,…,表达式n) //求最大值
min(表达式1,…,表达式n) //求最小值
abs(表达式) //求绝对值
floor(表达式) //向下取整
ceil(表达式) //向上取整
eof(表达式) //文件尾
eoln(表达式) //行结束
1.4 算法和算法分析
1.4.1 算法的定义
算法(Algorithm):是对特定问题求解步骤的一种描述,它是指令(规则)的有限序列,其中每一条指令表示一个或多个操作。
算法的特征:
①输入、②输出、③确定性、
④有穷性、⑤可行性。
算法与程序的区别?
程序不一定满足有穷性
1.4.2 算法设计的要求
(1)、正确性(Correctness)
(2)、可读性(readability)
(3)、健壮性(robustness)(鲁棒性)
(4)、效率与低存储量的要求。
(时间复杂性与空间复杂性)
评价算法的两个重要指标是什么?
时间复杂性和空间复杂性。
评价算法的一个最重要指标是什么?
算法的时间复杂性。
1.4.3 算法效率的度量
- 算法的时间复杂性 (Time Complexity)评价方法主要有以下两种。
(1)事后统计的方法
(2)事前分析估算的方法
- 事后统计的方法
在比较算法时,把算法首先编程实现,然后计算不同算法的实际运行时间
一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素。
①依据算法选用的何种策略;
②问题的规模
③所用语言
④编译程序产生的机器代码的质量
⑤机器执行指令的速度
- 事前分析估算的方法
把算法的本操作的重复执行的次数作为算法的时间度量。
- 算法的空间复杂性(Space Complexity)
算法的空间复杂性是指算法在执行过程中的存储量需求;
一个算法的存储量需求除了存放算法本身所有的指令、常数、变量和输入数据外,还包括对数据进行操作的工作单元和存储实现计算所需信息的辅助空间;
一般指辅助空间所占的存储空间。
若不需要辅助空间,则称此算法为原地工作。
- 例题:分析下面两个矩阵相乘的时间复杂性
其中矩阵的“阶”n为问题的规模。
void MATRIXMLT(int A[][n], int B[][n], int C[][n]){
int i,j,k;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
C[i][j]=0;
for (k=0;k<n;k++)
C[i][j]+=A[i][k]*B[k][j];
}
}
T ( n ) = 2 n 3 + 3 n 2 + 2 n + 1 T(n)=2n^3+3n^2+2n+1 T(n)=2n3+3n2+2n+1
时间复杂性的大O表示法:
上面例子的时间复杂性记为
O ( 2 n 3 + 3 n 2 + 2 n + 1 ) O(2n^3+3n^2+2n+1) O(2n3+3n2+2n+1)
当n趋于无穷大时,T(n)与n3 是同阶的,可记作: T ( n ) = O ( n 3 ) \color{red} T(n)=O(n^3 ) T(n)=O(n3)。
称作渐进时间复杂度,简称时间复杂度。
时间复杂度的常见阶
多 项 式 级 { 常 数 阶 O ( 1 ) 对 数 阶 O ( l o g 2 n ) 线 性 阶 O ( n ) 线 性 对 数 阶 O ( n ∗ l o g 2 n ) 平 方 阶 O ( n 2 ) 立 方 阶 O ( n 3 ) K 次 方 阶 O ( n k ) 指 数 阶 O ( 2 n ) 多项式级 \begin{cases} 常数阶 &O(1)\\ 对数阶&O(log_2n)\\ 线性阶&O(n)\\ 线性对数阶&O(n*log_2n)\\ 平方阶&O(n^2)\\ 立方阶&O(n^3)\\ K次方阶&O(n^k)\\ 指数阶&O(2^n) \end{cases}%\tag{1} 多项式级⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧常数阶对数阶线性阶线性对数阶平方阶立方阶K次方阶指数阶O(1)O(log2n)O(n)O(n∗log2n)O(n2)O(n3)O(nk)O(2n)
指数时间的关系
O ( 2 n ) < O ( n ! ) < O ( n n ) \color{red}O(2^n)<O(n!)<O(n^n) O(2n)<O(n!)<O(nn)
- 时间复杂度的相关概念
- 最坏时间复杂度
- 平均时间复杂度
- 最好时间复杂度