本文已参与「新人创作礼」活动,一起开启掘金创作之路
前言
Python语法相关的分享文章先告一段落了,接下来罗罗攀将分享Python数据结构与算法相关的内容,大家可以持续关注哦~
复杂度分析的意义
学数据结果与算法之前,我们都需要学一个东西,那就是复杂度分析,这也是算法学习的精髓。复杂度又分时间复杂度和空间复杂度,其实也就是运行的快慢和存储空间的大小。
你可能会有这样的疑问,我把代码跑一遍,通过统计就能知道代码的运行时间和占用空间大写,为什么要做复杂度分析了?
这是因为这种方法有很大的局限性,不同的电脑环境,得到的结果可能都不一样,同时也受数据规模的影响,例如排序算法,极端情况下,如果数据本身就是有序的,排序算法不需要任何操作,执行时间就很短。
所以,我们希望不需要具体的测试,就能估计算法的执行效率的方法,这就是时间,空间复杂度分析。
大O复杂度表示法
我们来看这段代码,1到n累加,你觉得这个代码的执行时间是多少了。
sum = 0
for i in range(1,n+1):
sum = sum + i
print(sum)
我们假设每一行代码执行的时间是一样的,都为time。第一行代码需要1个time,第二行和第三行代码都执行了n次,就是2n*time,最后一行代码也是1个time,总共的执行时间就是(2n+2)*time。
如果n无限大,常数,系数都可以忽略。我们就只需要记录最大量级的就可以,我们用大O表示代码的时间复杂度,记为O(n)。
时间复杂度分析
那怎样快速分析出代码的时间复杂度了,我这里有三个方法交给大家。
1.只关注循环执行次数最多的一段代码
例如上面的代码,第一行和第四行都是执行一次,与n无关,循环次数最多的就是第二行和第三行,都是执行n次,所以时间复杂度就是O(n)。
2.加法法则:总复杂度等于量级最大的那段代码的复杂度
我们来看代码。
sum_1 = 0
for i in range(1,101):
sum_1 = sum_1 + i
sum_2 = 0
for p in range(1, n+1):
sum_2 = sum_2 + p
sum_3 = 0
for q in range(1, n+1):
for j in range(1, n+1):
sum_3 = sum_3 + q*j
print(sum_1 + sum_2 + sum_3)
三段代码的复杂度分别是O(1)、O(n)和O(n2),最后,我们取O(n2)。
3.乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
这个很好理解,如果一个函数中嵌套函数,就用两个函数复杂度相乘,即得到所有的复杂度。
今天的分享就到这了,我们下期再见~