Python数据结构1:算法复杂度做算法分析:大O表示算法

本文介绍了评估算法效率的方法,包括使用计算资源指标、迭代与非迭代算法的区别及大O表示法的基本概念。通过实例讲解了如何用赋值语句数量衡量算法复杂度,并引入了问题规模和数量级函数的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 评价算法标题好坏的指标

1.1 计算资源指标

1.1.1 存储空间或内存

由于不好区分是数据本来就需要很大的空间,还是由于算法太垃圾占用了太多的空间。所以通常不用这个描述

1.1.2 算法执行时间

通常用这个描述计算资源指标
在python中可以用time模块统计运行时间。
time.time()是系统的时间。

import time
start = time.time()
需要执行的程序
end = time.time()
print(end - start)

end - start 就是程序运行的时间。通常我们执行多次程序,避免单次执行程序的偏差。

2. 迭代算法和非迭代算法的对比

2.1 迭代算法

迭代算法就是说下一次的结果是基于上一次来的,一般会有个循环
迭代的累加求和算法

import time
def sumOfN(n):
	start = time.time()
	theSum = 0
	for i in range(1, n + 1):
		theSum = theSum + i
	end = time.time()
	return theSum, end - start
print(sumOfN(10000000)) # 求 1-10000000的累加和并计算这个程序的运行时间

2.2 非迭代算法

非迭代算法直接一步到位计算,不需要循环

import time
def sumOfN(n):
	start = time.time()
	theSum = 0.5 * n * (n + 1)
	end = time.time()
	return theSum, end - start
print(sumOfN(10000000)) # 求 1-10000000的累加和并计算这个程序的运行时间

2.3 同一问题迭代和非迭代的对比

上面的第二个程序比第一个程序运行快太多了。所以第二种比较好,但是第二个公式可能比较难想出来。

3. 用执行时间衡量算法好坏的问题

不同的编程语言、平台、机器,跑同一算法的时间有很大区别。因此只用执行时间,是有失偏颇的。我们需要一种更好的方法(与具体的机器、程序、运行时段等都无关的方法)来评价算法的好坏。

4. 大O表示法: 算法复杂度

4.1 赋值语句的个数衡量算法

赋值语句如下:

a = b

表示把b的值赋给a,这个过程既包括计算又包括存储。
赋值语句是一个合适的算法度量指标,他在所有的平台上都是一样的。赋值语句多,执行时间长,反之短 。

对于上述的sumOfN(n)sumOfN(n)sumOfN(n)函数

# import time #1
def sumOfN(n): #2
	# start = time.time() #3
	theSum = 0 #4 执行一次
	for i in range(1, n + 1): #5
		theSum = theSum + i #6 执行n次
	# end = time.time() #7
	return theSum # end - start #8
print(sumOfN(10000000)) # 求 1-10000000的累加和并计算这个程序的运行时间 #9

n是问题规模,第 4,6行是赋值语句
因此 sumOfN(n)sumOfN(n)sumOfN(n)的赋值语句数量是T(n)=n+1T(n) =n+1T(n)=n+1

4.2 问题规模

问题规模是影响算法执行时间的主要因素。对上述得累计求和算法,需要求和的n的个数就是问题规模
如,求1000个整数的累计和比1000000个整数的累计和,是同一问题的小规模。
算法分析就是要找出问题规模怎么影响算法的执行时间

4.3 数量级函数

T(n)T(n)T(n)的精确值不重要,他的主导部分最重要,如 T(n)=n+1T(n) = n + 1T(n)=n+1,n很大时,1就对算法的影响就忽略不计了。

大O表示法:数量级函数就是只取T(n)T(n)T(n)中关于n的部分,记作O(f(n))O(f(n))O(f(n))f(n)f(n)f(n)T(n)T(n)T(n)中关于nnn的部分


T(n)=n+1T(n) = n + 1T(n)=n+1O(n)O(n)O(n)
T(n)=5n2+27n+1T(n) = 5n^2 + 27n + 1T(n)=5n2+27n+1O(n2)O(n^2)O(n2)

4.4 影响算法执行时间的其他因素

有时不仅问题规模决定运行时间,一些具体的数据也可能会影响算法运行时间
如排序问题中,有的数据集已经只有个别的数没排好顺序,有的数据集有特别的多的数没排好顺序。
这时我们将各个数据集的情况求平均,用平均体现算法性能。

4.5 最常见的7种大O数量级函数

4.5 小练习

求这段代码的复杂度

解:
赋值语句包括四部分
T(n)=3+3n2+2n+1−>O(n2)T(n) = 3 + 3n^2 + 2n + 1 -> O(n^2)T(n)=3+3n2+2n+1>O(n2)

参考文献

本文的知识来源于B站视频 【慕课+课堂实录】数据结构与算法Python版-北京大学-陈斌-字幕校对-【完结!】,是对陈斌老师课程的复习总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值