目录
1.4 算法和算法分析3
1、算法的渐进时间复杂度
若有某个辅助函数,使得当n趋近于无穷大时,的极限值为不等于零的常数,则称是的同数量级函数。记作,称为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度。
一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数,它是问题规模n的某个函数,用表示。
定理1.1:若是m次多项式,则。
备注:忽略所有低次幂项和最高次幂系数,体现出增长率的含义。
2、分析算法时间复杂度的基本方法
①找出语句频度最大的那条语句作为基本语句。
②计算基本语句的频度的得到问题规模n的某个函数。
③取其数量级用符号“O”表示。
3、例子
(1)例1
//例1
x = 0;
y = 0;
for(int k = 0; k < n; k++){
x++;
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
y++;
}
}
,。
(2)例2
//例2
void exam(float x[][], int m, int n){
float sum[];
for(int i = 0; i < m; i++){
sum[i] = 0.0;
for(int j = 0; j < n; j++){
sum[i] += x[i][j];//嵌套最深层语句
}
}
for(i = 0; i < m; i++){
cout << i << ":" << sum[i] << endl;
}
}
时间复杂度是由嵌套最深层语句的频度决定的。
,。
4、算法时间复杂度分析例题
(1)例1
//例1:N*N矩阵相乘
for(i = 1; i <= n; i++){
for(j = 1; j <= n; j++){
c[i][j] = 0;
for(k = 1; k <= n; k++){
c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
}
}
算法中的基本操作语句为:
c[i][j] = c[i][j] + a[i][k] * b[k][j];
。
。
(2)例2
//例2
for(i = 1; i <= n; i++){
for(j = 1; j <= i; j++){
for(k = 1; k <= j; k++){
x = x + 1;
}
}
}
语句频度
。
。
(3)例3
//例3:分析以下程序段的时间复杂度
i = 1;//语句1
while(i <= n){
i = i * 2;//语句2
}
关键是要找出执行次数x与i的关系,并表示成n的函数。
若循环执行1次:,
若循环执行2次:,
若循环执行3次:,
……,
若循环执行x次:。
设语句2执行次数为x次,有循环条件,,。
,即,取最大值,所以该程序段的时间复杂度。
1.4 算法和算法分析4
1、算法时间复杂度计算
备注:有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同。
【例】顺序查找,在数组a[i]中查找值等于e的元素,返回其所在位置。
//【例】顺序查找,在数组a[i]中查找值等于e的元素,返回其所在位置。
for(i = 0; i < n; i++){
if(a[i]== e){
return i + 1;//找到,则返回是第几个元素
}
return 0;
}
最好情况:1次;最坏情况:n;平均时间复杂度为:。
2、算法时间复杂度
最坏时间复杂度:指在最坏情况下,算法的时间复杂度。
平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
最好时间复杂度:指在最好情况下,算法的时间复杂度。
一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
3、计算法则
对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度。
①加法法则:。
②乘法法则:。
4、算法时间效率的比较
当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊。
时间复杂度按数量级递增顺序为:
5、渐进空间复杂度
空间复杂度:算法所需存储空间的度量,记作:,其中n为问题的规模(或大小)。
算法要占据的空间:算法本身要占据的空间,输入/输出,指令,常数,变量等;算法要使用的辅助空间。
6、算法空间复杂度分析例题
【例】将一维数组a中的n个数逆序存放到原数组中。
//【例】将一维数组a中的n个数逆序存放到原数组中。
//算法1
for(i = 0; i < n / 2; i++){
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
//算法2
for(i = 0; i < n; i++){
b[i] = a[n - i - 1];
}
for(i = 0; i < n; i++){
a[i] = b[i];
}
算法1:,原地工作;算法2:。
7、设计好算法的过程
抽象数据类型=数据的逻辑结构+抽象运算(运算的功能描述)。算法分析→好的算法。
其中,数据的逻辑结构(数据的存储结构1(算法11……算法1m)……数据的存储结构n(算法n1……算法nm))。