算法复杂度分析
在前面提到了时间复杂度类似于O(1)、O(n)等,O符号的意思,大概可以理解为操作的次数和数据个数的比例关系。比如:O(1)就是有限次数操作,O(n)就是操作正比于你的元素个数。
大O表示法
考虑计算n*n矩阵所有元素的和
0 1 2
3 4 5
6 7 8
#方法一
total_sum = 0
for i in range(n):
row_sum[i] = 0
for j in range(n):
row_sum[i] = row_sum[i] + matrix[i, j]
total_sum = total_sum + matrix[i, j]
#方法二
total_sum = 0
for i in range(n):
row_sum[i] = 0
for j in range(n):
row_sum[i] = row_sum[i] + matrix[i, j]
total_sum = total_sum + matrix[i, j] #注意此处和上边不同
其中,方法一的关键操作在j循环中,两步加法操作,由于嵌套在第一个循环里,其操作步骤是(2n)*n = 2n^2.
方法二的求和只有n次操作,他的操作次数是n + n * n = n^2 + n
如何计算时间复杂度
上边两个方法中,当n非常大的时候,n^2的数值将占有主要地位,从此可以忽略n的影响,因此两个方法的时间复杂度均为O(n)。
常用时间复杂度
O | 名称(举例) |
---|---|
1 | 常量时间(一次赋值) |
log n | 对数时间(折半查找) |
n | 线性时间(线性查找) |
nlog n | 对数线性时间(快速排序) |
n^2 | 平方(两重循环) |
n^3 | 立方(三重循环) |
2^n | 指数(递归求斐波那切数列) |
n! | 阶乘(旅行商时间) |
空间复杂度
相对时间复杂对,空间复杂度讨论较少。空间复杂度相对好算一些,就是每个元素的空间占用乘以总的元素数。
有些算法需要额外的空间存储,有些可以本地解决。
时间换空间,空间换时间
空间换时间: 比如典型的就是Python的集合,虽然比较浪费空间,但是却能用O(1)的时间复杂度来判重
时间换空间: 典型的时缓存失效算法,我们不可能缓存下无限容量的数据,就会使用一些缓存淘汰算法来保证空间可用。