- 时间复杂度:执行当前程序消耗的度量
- 空间复杂度:当前程序运行占用内存的度量
以上两个维度去衡量一个算法的耗时与占用内存,用big O 来表示
时间复杂度
常数阶复杂度 O(1)
执行的程序中不存在循环,比如
a = 1
b = 2
print(a+b)
在一段代码中执行的次数是常数,其时间复杂度就是O(1)
线性阶复杂度O(n)
在执行的程度中存在单层循环,时间复杂度为循环的次数n,比如
for i in range(0, n):
print(i)
对数阶O(logN)
i = 1
while(i<n):
i = i * 2
每一次执行循环体,i的值就乘以2,循环x次之后,i 大于 n退出循环体,结束运行,也就是说 2 的 x 次方等于 n,那么 x = log2^n,则时间复杂度为O(logN)
线性对数阶O(nlogN)
O(nlogN) = O(N)x O(logN),在上述的循环体中增加时间负责度为O(N)的循环,如
for i in range(0,n):
while(i<n):
i = i * 2
平方阶O(n²)
两个O(N)嵌套循环
for i in range(0,n):
for j in range(0,n):
print('xxxx')
依次可类推三阶、K方阶的复杂度
常见的时间复杂度
- 二分查找 O(logn)
- 二叉树遍历O(n):每个节点每次只查找一个且仅查找一次
- 有序二维矩阵O(n)
- 归并排序O(nlogn)
- 记忆化递归O(n)
空间复杂度
与时间复杂度类似,但是比时间复杂度简单。
原则:
- 数组的长度
- 递归的深度
数组的长度基本上空间复杂度,如果开了n个数的一维数组,则空间复杂度是O(n),如果两维数组,数组的长度为n的平方,则空间复杂度就是O(n**2)
如果有递归,递归的深度就是空间复杂度。如果既有递归,又有数组,则它们两的最大值就是空间复杂度