【数据结构(青岛大学 王卓)】第1章 绪论 学习笔记(六)1.4 算法和算法分析3、1.4 算法和算法分析4

目录

1.4 算法和算法分析3

1、算法的渐进时间复杂度

2、分析算法时间复杂度的基本方法

3、例子

(1)例1

(2)例2

4、算法时间复杂度分析例题

(1)例1

(2)例2

(3)例3

1.4 算法和算法分析4

1、算法时间复杂度计算

2、算法时间复杂度

3、计算法则

4、算法时间效率的比较

5、渐进空间复杂度

6、算法空间复杂度分析例题

7、设计好算法的过程


1.4 算法和算法分析3

1、算法的渐进时间复杂度

若有某个辅助函数f(n),使得当n趋近于无穷大时,\frac{T(n)}{f(n)}的极限值为不等于零的常数,则称f(n)T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度。

一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数,它是问题规模n的某个函数,用T(n)表示。

定理1.1:若f(n)=a_{m}n^{m}+a_{m-1}n^{m-1}+...+a_{1}n+a_{0}是m次多项式,则T(n)=O(n^{m})

备注:忽略所有低次幂项和最高次幂系数,体现出增长率的含义。

2、分析算法时间复杂度的基本方法

①找出语句频度最大的那条语句作为基本语句。

②计算基本语句的频度的得到问题规模n的某个函数f(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++;
	}
}

f(n)=n(n+1)T(n)=O(n^{2})

(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;
	}
}

时间复杂度是由嵌套最深层语句的频度决定的。

f(n)=m*nT(n)=O(m*n)

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];

T(n)=\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{n}1=\sum_{i=1}^{n}\sum_{j=1}^{n}n=\sum_{i=1}^{n}n^{2}=n^{3}=O(n^{3})

T(n)=O(n^{3})

(2)例2

//例2
for(i = 1; i <= n; i++){
	for(j = 1; j <= i; j++){
		for(k = 1; k <= j; k++){
			x = x + 1;
		}
	}
}

语句频度

T(n)=\sum_{i=1}^{n}\sum_{j=1}^{i}\sum_{k=1}^{j}1=\sum_{i=1}^{n}\sum_{j=1}^{i}j=\sum_{i=1}^{n}\frac{i(i+1)}{2} =\frac{1}{2}(\sum_{i=1}^{n}i^{2}+\sum_{i=1}^{n}i)=\frac{1}{2}(\frac{n(n+1)(2n+1)}{6}+\frac{n(n+1)}{2})=\frac{n(n+1)(n+2)}{6}

T(n)=O(n^{3})

(3)例3

//例3:分析以下程序段的时间复杂度
i = 1;//语句1
while(i <= n){
	i = i * 2;//语句2
}

关键是要找出执行次数x与i的关系,并表示成n的函数。

若循环执行1次:i=1*2=2

若循环执行2次:i=2*2=2^{2}

若循环执行3次:i=2*2*2=2^{3}

……,

若循环执行x次:i=2^{x}

设语句2执行次数为x次,有循环条件i\leq n\therefore 2^{x}<=n\therefore x\leq log_{2}n

2^{f(n)}\leq n,即f(n)\leq log_{2}n,取最大值f(n)=log_{2}n,所以该程序段的时间复杂度T(n)=O(log_{2}n)

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;平均时间复杂度为:O(n)

2、算法时间复杂度

最坏时间复杂度:指在最坏情况下,算法的时间复杂度。

平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。

最好时间复杂度:指在最好情况下,算法的时间复杂度。

一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。

3、计算法则

对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度。

①加法法则:T(n)=T_{1}(n)+T_{2}(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))

②乘法法则:T(n)=T_{1}(n)\times T_{2}(n)=O(f(n))\times O(g(n))=O(f(n)\times g(n))

4、算法时间效率的比较

当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊。

时间复杂度T(n)按数量级递增顺序为:

5、渐进空间复杂度

空间复杂度:算法所需存储空间的度量,记作:S(n)=O(f(n)),其中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:S(n)=O(1),原地工作;算法2:S(n)=O(n)

7、设计好算法的过程

抽象数据类型=数据的逻辑结构+抽象运算(运算的功能描述)。算法分析→好的算法。

其中,数据的逻辑结构(数据的存储结构1(算法11……算法1m)……数据的存储结构n(算法n1……算法nm))。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值