时间复杂度
我们平时编程的时候,怎么判断哪些代码块运行时间最短,用什么方式来体现算法运行的快慢呢?
这就用到了时间复杂度。时间复杂度就是用来评估算法运行效率的一个度量,或者说是一个式子。
我们来看以下例子:
例子一:时间复杂度为 O(1)
print("Hello World")
例子二:时间复杂度为 O(n)
for i in range(n):
print("Hello World")
例子三:时间复杂度为 O()
for i in range(n):
for j in range(n):
print("Hello World")
例子四:
n = 64
while n > 1:
print(n)
n = n // 2 # n整除2
我们来看下例子四,根据代码算法,举个例子,比如:,则,所以这里的时间复杂度记为O()或O()
时间复杂度小结
- 时间复杂度是用来估计算法运行时间的一个度量或单位式子
- 一般来说,时间复杂度高的算法比复杂度底的算法慢
- 常见的时间复杂度(按效率排序)
O(1) > O(${log_{n}}$) > O(n) > O(n${log_{n}}$) > O($n^2$) > O($n^3$)
快速判断算法复杂度
适用于绝大多数简单的情况:
- 确定问题规模 n,比如说对于列表的排序,问题规模就是列表的长度了
- 循环减半过程 logn,看算法是否有循环减半的过程
- k 层关于 n 的循环 n的k次方
复杂情况:根据算法执行过程以及含义来进行判断
空间复杂度
空间复杂度:用来评估使用算法时内存占用大小的度量。
空间复杂度的表达方式与时间复杂度的完全一样:
- 算法使用了几个变量:O(1)
- 算法使用了长度为 n 的一维列表:O(n)
- 算法使用了 m 行 n 列的二维列表:O(mn)
我们在平时开发中所说的算法复杂度时,往往就是指时间复杂度,需要考虑用空间来换时间了,大部分都是考虑到时间是比空间重要,因为空间是可以用机器设备来维持的,比如;加内存条,加磁盘等,而时间是有限且等不及的。