时间复杂度和大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,不是和理解啊,那是什么鬼?)
常见时间复杂度大小比较:
上面没写的是:n^2 < n^2*log(n)<n^3