数据结构-第一章-绪论
程序 = 数据结构 + 算法
——题记
1-1 内容简介
1-2 基本概念和术语
数据:能被输入计算机并被计算机处理的各种符号的集合。
数据元素:数据的基本单位,通常作为一个整体处理。(集合的个体)
数据对象:性质相同的数据元素的集合。(集合的子集)
数据项:数据的最小单位。
数据结构:数据元素之间的关系。
逻辑结构:数据元素之间的逻辑关系。
存储结构:数据元素及其关系在计算机存储器中的结构。
逻辑结构:集合、线性结构、树状结构、网结构。
存储结构:顺序存储、非顺序(链接)存储。
数据类型= 值的集合 + 值集合上的一组操作
抽象数据类型 = 数学模型 + 模型上的一组操作(对数据结构逻辑上的定义),可用(D,S,P)三元组,即(对象,关系,操作)进行形式定义。
基本操作定义格式说明:
1.参数表:
赋值参数:只提供输入值
引用参数:以&打头,可提供输入值,且返回操作结果
2.初始条件:if(...) return ERROR;
3.操作结果: return OK;
用C语言实现抽象数据类型的定义:
typedef struct{ //复数
float real;
float imag;
}Complex;
void assign(Conplex *a,float real,float imag);
void add(...) //略
1-3 算法和算法分析
算法:指令的有限序列。
特性:
1.有穷性:有穷步、有穷时间内完成
2.确定性:任何条件下只有唯一一条执行路径
3.可行性:算法描述的操作可以通过已实现的基本操作执行有限次实现
4. 0个或多个输入;1个或多个输出
正确(结果)、可读(人)、健壮(非法OUT)、高效(时、空)
时间复杂度分析
算法运行时间
= 一种简单操作所需时间 * 操作次数
= ∑ 每条语句频度(执行次数) * 执行一次所需时间
由于每条语句执行一次所需要的时间与算法无关,可假设执行每条语句所需要的时间均为单位时间
从而只需要分析算法频度之和,举例如下:
//计算两个n*n矩阵相乘
for(int i = 1; i <= n; i++) // n+1次
for(int j = 1; j <= n; j++){ // n(n+1)次
c[i][j] = 0; // n*n次
for(int k = 0; k < n; k++) // n*n*(n+1)次
c[i][j] = c[i][j] + a[i][k] * b[k][j]; // n*n*n次
}
则算法时间消耗T(n) = 2n3 + 3n2 + 2n + 1,显然这是一个关于n的函数。为了方便比较不同算法的时间效率,可以仅比较数量级。
引入辅助函数f(n),如果T(n)与f(n)是同阶函数(即n趋于无穷大时,T(n)/f(n)极限为常数c(≠0)),记作T(n) = O(f(n))。称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
定义:算法中基本语句重复执行次数是问题规模n的某个函数f(n),算法的时间量度为T(n) = O(f(n))
从而对于上例中的算法,时间复杂度为O(n3)。
基本语句:
1.重复执行次数与算法执行时间成正比
2.对算法运行时间“贡献”最大
3.执行次数最多
问题规模:具体问题具体分析。例如树中n为结点个数,图中n为顶点数或边数。
下面是一个简化计算小窍门:
定理1:若f(n) = amnm+......+a1n+a0是m次多项式,则T(n) = O(nm)(am≠0)
分析时间复杂度的基本方法:
- 找出语句频度最大的语句
- 计算基本语句的频度得到f(n)
- 取其数量级
下面是一个稍复杂的例子:
i=1;
while(i<=n)
i*=2; //语句1
关键是找出执行次数x与n的关系,并表示成n的函数
设语句1执行x次,则由循环条件有 2x <= n,即 x <= log2 n
故取f(n)= log2 n
常见的时间复杂度关系:
O(1) < O(log n) < O(n) < O(nlog n) < O(n2) < O(n3) < O(2n) < O(n!)
值得指出的是,有的情况下,算法中基本操作重复执行次数会随输入数据集不同而不同,故算法时间复杂度可细分为最坏、平均、最好时间复杂度。一般考虑最坏时间复杂度,以保证算法实际运行时间不会比它更长。
对于复杂的算法,可以将它拆分为几个容易估算的部分,然后利用大O运算法则计算时间复杂度:
加法规则:T(n) = T1(n) + T2(n) = O (max(f1(n),f2(n)))
乘法规则:T(n) = T1(n)*T2(n) = O (f1(n)*f2(n))
空间复杂度分析
空间复杂度:S(n) = O(f(n))
算法占据的空间 = 算法本身占据的空间(输入输出、指令、常数、变量...)+所需要的辅助空间(main)
浙公网安备 33010602011771号