好简单的时间复杂度&空间复杂度呀
介绍:
一般都用「时间」和「空间」两个维度来考量算法的优劣。
- 时间维度: 指执行算法时所消耗的时间,通常用「时间复杂度」来描述
- 空间维度: 指执行算法时所占用的内存空间,通常用「空间复杂度」来描述
一、 时间复杂度
「大O表示法」是一个通用的表示方法,大O表示法并不是真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的。
常见的时间复杂度量级有:
- 常数阶O(1)
- 对数阶O(logN)
- 线性阶O(n)
- 线性对数阶O(nlogN)
- 平方阶O(n2)
- 指数阶O(2n)
从上到下依次的时间复杂度越来越大,执行的效率越来越低。
1.常数阶O(1)
无论代码执行多少行,只要没有循环等结构,那这个代码的时间复杂度都是O(1),例:
i = 1
j = 2
i += 1
j += 2
...
2.线性阶O(n)
例:
def func(n):
for i in range(0,n):
i += 1
for循环内的代码执行次数为n,并且随着n增大线性增长,所以复杂度O(n)
3.对数阶O(logN)
例:
i = 1
while i < n:
i = i * 2
我们试着求解一下上面的代码,假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2n
也就是说当循环 log2n 次以后,这个代码就结束了。因此这个代码的时间复杂度为O(logn)
4. 线性对数阶O(nlogN)
O(nlogN) 其实很好理解,将时间复杂度为O(logN)的代码执行n遍,那么它的时间复杂度就是n*O(logN),也就是O(nlogN)
for i in range(0,n):
while i < n:
i = i * 2
6. 平方阶O(n2)
把O(n)的代码再嵌套循环一遍,它的时间复杂度就是O(n2),例:
for i in range(n):
for j in range(n):
i = i + 1
8. 立方阶O(n3) 和 K次方阶O(nk)
参考O(n2) , 立方阶就是循环3次,K次方阶就是循环K次。
二、空间复杂度
空间复杂度也不是用来计算程序实际占用的空间的,空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势。
空间复杂度比较常用的有: O(1)、O(n)、O(n2)
1. 空间复杂度O(1)
如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常数,可表示为O(1),例:
i = 1
j = 2
i = i + 1
j = j + 1
代码中的i j 所分配的空间都不随着处理数据量变化,因此它的空间复杂度为O(1)
- 空间复杂度O(n)
L = []
for i in range(0,n):
L.append(i)
最终得到的是一个长度为n的数组,并且随着n增大,占用的空间线性增长,因此这段代码的空间复杂度为O(n)。
备注:
刚开始学,比较初级,当作自己笔记,嘤~
上一篇: 科技书籍与文章排版:Ctex 与 texlive 的中文编译模板
下一篇: 选择排序