数据结构与算法(一):用时间复杂度评价算法

参考书籍:《漫画算法》

&1.时间复杂度
实现一个相同的功能,不同的人会使用不同的算法、代码。那么,我们如何评定谁完成的更好呢?假如说有两个人参加同一场考试,得到了相同的分数,甲却只花了乙一半的时间就交卷了,直观上我们会认为,甲比乙厉害。算法也是这样,在实现同样的功能的前提下,某种算法运行的时间更短、占用的空间更小,我们就说这个算法更为优秀。但由于代码运行的开发环境不同,输入数据的大小不同,算法的绝对执行时间一般是无法预估的,我们通过预估算法中基本操作的执行次数来衡量时间复杂度。
我们设T(n)为程序基本操作执行次数的一个函数(或者把它视作程序相对执行时间的一个函数),n为输入数据的大小,执行次数有以下几种情况:
(1)执行次数是线性的,T(n)=3n

for i in range(n):
	print("Operation 1")
	print("Operation 2")
	print("Operation 3")

这是非常直观的一种表达,这段代码进行了n次循环,每次循环有三个基本的print操作,于是它的基本操作执行次数T(n)=3n
(2)执行次数是常量,如T(n)=2

print("Operation 1")
print("Operation 2")

这样的操作和输入数据的规模无关,它只是进行了两次print操作而已。
(3)执行次数是一个多项式,如T(n)=0.5n2+0.5n

for i in range(n):
	for j in range(i):
		print("Operation 1")

进行print操作的次数明显为1+2+…+n,各项之间的关系是一个简单的等差数列,求和之后就是上述结果。
(4)执行次数是对数计算的,如T(n)=3log2n

while n>1:
	print("Operation 1")
	print("Operation 2")
	print("Operation 3")
	n = n/2

由于n=n/2是一个简单的赋值语句,我们认为n个这样的赋值语句占用的时间和1个这样的赋值语句占用的时间相差不多,在这里不算入T(n)中。我们这里要解决的问题是,这个循环的循环次数是多少?假设循环次数为K,就有n/2K=1,我们可以得到K=log2n,实际上应该还要进行取整并+1的操作,但在这里我们略去。

&2.渐进时间复杂度
官方定义如下:若存在函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称为O(f(n)),O被称为算法的监禁时间复杂度,简称为时间复杂度。
我们用浅显的话来阐述它的定义,那就是O实际上是把T(n)转化为一个最能够代表T(n)的数量级:T(n)是常数级的,那么O(n)=1;T(n)只保留其中的最高阶项,最高阶项存在,则省去最高阶项前面的系数。所以对于前面的四个例子,时间复杂度分别为T(n)=O(n);T(n)=O(1);T(n)=O(n2);T(n)=O(logn);
实际上我们还有很多形式的时间复杂度:如O(nlogn),O(n3),O(2n),O(n!),它们之间大小关系为O(1) 常数阶 < O(logn) 对数阶 < O(n) 线性阶 < O(nlogn) < O(n2) 平方阶 < O(n3) < { O(2n) < O(n!) < O(nn) }.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值