Python 测开27期 - julia - 学习笔记 - 算法性能评估

时间复杂度

大 O 表示法

def tmp(n):
    add = 0
    for i in range(n):
        add += i
    return add

运行时间:T(n) = (2n + 1) * unit

T(n) = O(f(n)) , O表示 T(n) 与 f(n) 成正比

O 表示渐近时间复杂度

表示代码执行时间随数据规模增长的变化趋势

当 n 很大时,低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略.就可以记为:T(n) = O(n); T(n) = O(n2)。

只关注循环次数多的代码

def tmp(n):
    add = 0
    for i in range(n):
        add += i
    return add

O(n)

选大量级

def tmp(n):
    for i in range(999):
        print(123)

    for i in range(n):
        print(1)

    for i in range(n):
        for j in range(n):
            print(2)

O(n2)

嵌套循环要乘积

def tmp(n):
    for i in range(n):
        a(i)

def a(n):
    for i in range(n):
        print('c')

O(n2)

常见复杂度分析

  • 非多项式量级(过于低效) : O(2n) 和 O(n!)。
  • 多项式量级:O(1), O(logn), O(n), O(nlogn), O(nk)

O(1)

a=2
b=3
d=4

O(logn)

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

i = 20,21, 22, 23…2x

退出循环的条件是 : 2x = n ,即 x = log2n,时间复杂度为 O(log2n)

def tmp(n):
    i = 1
    while i < n :
        i = i * 3

log3n 就等于 log32 * log3n,所以 O(log3n) = O(C * log2n),其中 C=log32 是一个常量。基于我们前面的一个理论:在采用大 O 标记复杂度的时候,可以忽略系数,即 O(Cf(n)) = O(f(n))。所以,O(log2n) 就等于 O(log3n)。因此,在对数阶时间复杂度的表示方法里,我们忽略对数的“底”,统一表示为 O(logn)

O(m+n)、O(m*n)

def tmp(m, n):
    for i in range(m):
        print(1)

    for i in range(n):
        print(2)

空间复杂度

  • 渐进时间复杂度:表示算法的执行时间与数据规模之间的增长关系。
  • 渐进空间复杂度:表示算法的存储空间与数据规模之间的增长关系。
def tmp(n):
    a = [1]*n
    for i in a:
        print(i)

空间复杂度是: O(n)