一、时间复杂度
- 我们将加、减、乘、除、打印等基本的操作认为对时间的消耗是1,即执行一次操作的时间复杂度是
O
(
1
)
O(1)
O(1)。
O
O
O在数学中表示一个式子的上界,简单理解为估计、大约的意思。
- 对于下图中2个例子的时间复杂度:
1)第一个例子:我们认为3个print应该是 O ( 3 ) O(3) O(3),但最小的单位是 O ( 1 ) O(1) O(1),对于并列的操作只计算一次复杂度,即 O ( 1 ) O(1) O(1);
2)第二个例子中:第一层for循环里有一个print,要执行n次,在里面嵌套一个for循环,循环里还有print,这个print要执行 n 2 n^2 n2次,所以我们认为整体的时间复杂度为 O ( n + n 2 ) O(n+n^2) O(n+n2),但时间复杂度只是估计值,取最大即可,所以认为时间复杂度为 O ( n 2 ) O(n^2) O(n2)
- 对于下图中的时间复杂度,当n=64时,打印64,32,16,8,4,2,共打印6次,而
2
6
=
64
,
log
2
64
=
6
2^6=64,\log_264=6
26=64,log264=6,所以时间复杂度为
O
(
log
2
n
)
O(\log_2n)
O(log2n)或
O
(
log
n
)
O(\log n)
O(logn)。
- 当算法过程出现循环折半的时候,时间复杂度就会出现 log n \log n logn
- 总结:
1)时间复杂度是用来估计算法运行时间的一个式子(单位);
2)一般来说,时间复杂度高的算法比复杂度低的算法慢;
3)常见的时间复杂度(按效率排序):
O ( 1 ) < O ( log n ) < O ( n ) < O ( n log n ) < O ( n 2 ) < O ( n 2 log n ) < O ( n 3 ) O(1)\lt O(\log n)\lt O(n)\lt O(n\log n)\lt O(n^2)\lt O(n^2\log n)\lt O(n^3) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)
4)复杂问题的时间复杂度:
O ( n ! ) , O ( 2 n ) , O ( n n ) O(n!), O(2^n),O(n^n) O(n!),O(2n),O(nn) - 如何快速判断时间复杂度:
二、空间复杂度
- 空间复杂度:用来评估算法内存占用大小的式子;
- 空间复杂度的表示方式与时间复杂度完全一样:
1)算法使用了几个变量: O ( 1 ) O(1) O(1);
2)算法使用了长度为n的一维列表: O ( n ) O(n) O(n);
3)算法使用了m行n列的二维列表: O ( m n ) O(mn) O(mn); - 空间换时间:采用更多的空间来换取运行速度。