算法性能评估
时间复杂度
- 规模:数据的大小对算法至关重要;例:是一个数据还是一百万条数据?影响很大。
- 运行环境:环境的快慢对算法至关重要;例:在手机和电脑上运行同一算法,速度肯定不一样。
大 O 表示法
def tmp(n):
add = 0
for i in range(n):
add += i
return add
假设每一行代码的运行时间时 1 unit;
算法的运行时间为:T(n) = (2n + 1) * unit
算法的运行时间与规模成正比,公式表示为:T(n) = O(f(n));O 表示 T(n) 与 f(n) 成正比
O 表示渐进时间复杂度,表示代码执行时间随数据规模增长的变化趋势
只关注循环次数多的代码
def tmp(n):
add = 0 # 1 unit
for i in range(n): # n * unit
add += i # n * unit
return add
假设 n 为无穷大的数,才有可能计算时间复杂度(如果 n 特别小,程序运行时间误差非常小)
在这个前提下,就可以忽略第一行,只关注循环次数多的代码,将这部分代码看作程序运行时间
此时时间复杂度可以记为:T(n) = O(n)
选大量级
def tmp(n):
for i in range(999):
print(0)
for i in range(n):
print(1)
for i in range(n):
for j in range(n):
print(2)
前提:假设 n 为无穷大的数
第一个循环的时间复杂度是:2 * 999
第二个循环的时间复杂度是:2 * n
第三个循环的时间复杂度是:n2
这种情况下,只取大量级,此时时间复杂度记为:T(n) = O(n2)
嵌套循环要乘积
def tmp(n):
for i in range(n):
a(i)
def a(n):
for i in range(n):
print(1)
两层嵌套循环,时间复杂度记为:T(n) = O(n2)
常见复杂度分析
- 非多项式量级
- 多项式量级
空间复杂度
渐进空间复杂度,表示算法的存储空间与数据规模之间的增常关系。
def tmp(n):
a = [1] * n
for i in a:
print(i)
第二行的空间复杂度就是:O(n)