时间复杂度和大O记号

时间复杂度:运行一个程序的基本步骤的总数量。(这么理解比较直观吧,看他一共需要执行的步骤)


Q:A,B,C,是1000以内的自然数,满足A+B+C=1000,A平方加B平方等于C平方。方法一:枚举法

import time

start_time = time.time()

for a in range(1001):
    for b in range(1001):
    for c in range(1001):
        if a + b + c == 1000 and a**2 + b**2 = c**2:
        print('a,b,c:%d,%d,%d'%(a,b,c))

end_time = time.time()
print('time is : %'%(end_time - start_time))


所需要的步骤:T = 1001*1001*1001*2
问题规模为N的话
T(n)=N*N*N*2 = 2*N^3  (常数2,可以不计较,2*N^3与10*N^3属于一个量级)
时间复杂度:T(n) = N^3

"大O记法":对于单调的整数函数f,若存在一个整数函数g和常实数C(C>0),使得对于充分大的n总有f(n) <= C*g(n),就说g是f的渐近函数,记f(n)=O(g(n))

“最坏时间复杂度”:最多需要多少步骤,提供了一种保证,在最坏时间复杂度下,该程序一定能运行完。


时间复杂度基本计算:
1、基本操作,即只有常数项,认为其时间复杂度为O(1)
2、顺序结构,时间复杂度按加法进行计算
3、循环结构,时间复杂度按乘法计算
4、分支结构,时间复杂度取最大值
5、判断一个算法的效率时,往往只需要关注操作数量的最高次项,次要项和常数项可以忽略
6、没有说明时,我们所分析的算法时间复杂度是“最坏时间复杂度”


改进算法:

for a in range(1001):
    for b in range(1001):
    c = 1000 - a - b
    if a**2 + b**2 == c**2:
        print('a,b,c:%d,%d,%d'%(a,b,c))

算法时间复杂度:
T(n) = N*N*(1 + max(0,1)) =2*N^2
     = O(N^2)


常见的时间复杂度(logn,不是和理解啊,那是什么鬼?)

时间复杂度和大O记号

常见时间复杂度大小比较:

时间复杂度和大O记号
上面没写的是:n^2 < n^2*log(n)<n^3