《数据结构》| 第二章 算法分析

算法分析

估计算法的时间复杂度

为了简单起见,我们只采用大O的定义:

定义: 如果存在正常数 c c c n 0 n_0 n0 使得当 N ⩾ n 0 N\geqslant n_0 Nn0 T ( N ) &lt; = c f ( N ) T(N)&lt;=cf(N) T(N)<=cf(N),则记为
T ( N ) = O ( f ( N ) ) T(N)=O(f(N)) T(N)=O(f(N))
当我们说 T ( N ) = O ( f ( N ) ) T(N)=O(f(N)) T(N)=O(f(N))时,我们是保证函数 T ( N ) T(N) T(N)在以不快于 f ( N ) f(N) f(N)的速度增长,因此, f ( N ) f(N) f(N) T ( N ) T(N) T(N)的一个上界。

对于一个具体的程序,我们通常希望知道它的时间复杂度空间复杂度(这个我们放到以后再说),这就是我们要做的算法分析,我们看一个简单的例子:

int Sum(int N){
	int i,sum=0;
	for(i = 1;i <= N;i++ ){
		sum += i;
	}
	return sum;
}

假设 sum+=i 这个操作需要耗费1个时间单元,它被执行了N次。初始化 i 和 sum 各需要1个时间单元,返回值也需要1个,那么这段程序的开销就是N+3。我们会说这段程序的时间复杂度是 O ( N ) O(N) O(N)

简单计算时间复杂度的方法

最简单的,我们只需要数出循环的开销就可以了。
循环嵌套则将其开销相乘。
递归的程序则判断递归的总空间(例如归并排序,快速排序,回溯法)。
我们不关心常数和增长率较小的函数,我们只关心最大的,增长最快的函数。
常见的时间复杂度函数(由“小”到“大”):

函数名称
c常数
l o g N logN logN对数级
l o g 2 N log^2N log2N对数平方
N N N线性
N l o g N NlogN NlogN
N 2 N^2 N2平方级
N 3 N^3 N3立方级
2 N 2^N 2N指数级

参考资料:
Data Structures and Algorithm Analysis in CMark Allen Weiss

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值