0 时间复杂度

快:时间复杂度
省:空间复杂度

1. 时间复杂度分析

1.1 实例1

def get_sum(n):
    result = 0
    for i in range(1,n+1):
        result += i
    return result

假设每行代码对应的cpu执行时间一样,为一个时间单位unit_time
可以看到该函数第2、5行执行1次,第3、4行执行n次
总共执行时间为:
T(n)=2 * unit_time+2 * n * unit_time=(2+2n) * unit_time

1.2 实例2

def print_matrix(n):
    for i in range(n):
        for j in range(n):
            print("*",end="")
        print()

假设每行代码对应的cpu执行时间一样,为一个时间单位unit_time
可以看到该函数第2、5行执行n次,第3、4行执行n*n次
总共执行时间为:
T(n)=2 * n * unit_time+2 * n2 * unit_time=(2n+2n2) * unit_time

1.3 总结

通过以上两个实例可知,代码的执行时间与执行次数n程正比
我们将这个规律总结成公式
T(n) = O(f(n))
T(n):代码的总执行时间
n:数据规模
f(n):每行代码执行的次数总和
O:表示T(n)与f(n)成正比关系

大O时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度,简称时间复杂度。
当n很大时,公式中的低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略。
我们只需要记录一个最大量级就可以,如果用大O表示法表示上述两实例的时间复杂度,就可以记为:
实例一:T(n) = O(n)
实例二:T(n) = O(n2)
注意:即便某一行代码循环执行1000次、10000次,只要是一个已知的数,跟n无关,照样也是常量级的执行时间。当n无限大的时候,就可以忽略。

1.4 实战

  1. 总复杂度等于量级最大的那段代码的复杂度
def getsum_and_printmatrix(n):
    result = 0
    #求和
    for i in range(1,n+1):
        result += i
    #打印矩阵   
    for i in range(n):
        for j in range(n):
            print("*",end="")
        print()    
    return result

求和的时间复杂度为O(n)
打印矩阵的时间复杂度为O(n2)
只关注影响最大的因子,所以这段代码的时间复杂度为O(n2)

  1. 嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
def printmatrix(n):
    for i in range(n):
        for j in range(n):
            for k in range(n):
                print("*",end="")
            print()
        print()

乘积法则:关注执行次数最多的那段代码,因此这段代码的时间复杂度为O(n3)

2. 几种常见的时间复杂度分析

多项式量级:
常量阶O(1)
对数阶O(logn)
线性阶O(n)
线性对数阶O(nlogn)
平方阶O(n2) 立方阶O(n3) k次方阶O(nk)
非多项式量级:
指数阶O(2n)
阶乘阶O(nn)

2.1 非多项式量级

数据规模n越大,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法是非常低效的算法。

2.2 常量阶O(1)

O(1)只是常量级时间复杂度的一种表示方法,并不是指只执行了一行代码。比如下面这段代码,即便是有5行,它的时间复杂度也是O(1)

print(1)
print(2)
print(3)
print(4)
print(5)

2.3 对数阶O(logn)

对数阶时间复杂度非常常见,但是难以分析

def getResult(n):
    i = 1
    while i<n:
        i = i*2

每次i乘以2后就距离n更近了一分。也就是说,有多少个2相乘后大于n,则会退出循环。2^i=n,i=logn,所以时间复杂度为O(logn)

2.4 线性对数阶O(nlogn)

def getResult(n):
    result = 0
    for i in range(1,n+1):        #O(n)
        while i<n:                     #O(logn)
            i = i*2
            print("i= ",i)
        result += i
        print("result= ",result)
    return result

2.5 O(m+n)

def calc(m,n):
    result1 = 0
    result2 = 0
    for i in range(m):
        result1 += i
    for j in range(n):
        result2 +=i
    
    return result1,result2

m,n表示两个数据规模。我们无法事先评估哪个量级大,所以时间复杂度为O(m+n)

2.6 O(m*n)

def calc(m,n):
   result = 0
   for i in range(m):
       temp = 0
       for j in range(n):
           temp += j
       result += temp
   
   return result

m,n表示两个数据规模。我们无法事先评估哪个量级大,所以时间复杂度为O(m*n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值