复杂度分析

131 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

前言

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.乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

这个很好理解,如果一个函数中嵌套函数,就用两个函数复杂度相乘,即得到所有的复杂度。

今天的分享就到这了,我们下期再见~