复杂度问题
一、估计算法运行效率与时间的复杂度
时间复杂度:用来评估算法运行效率的一个式子
# O(1)
# eg1:
print('Hello Word')
# eg2:
print('Hello World')
print('Hello Python')
print('Hello Algorithm')
打印几次都是O(1)
,1 是一个单位,近似的概念
# O(n)
for i in range(n):
print('Hello World')
# O(n*n)
# eg1:
for i in range(n):
for j in range(n):
print('Hello World')
# eg2:
for i in range(n):
print('Hello World')
for j in range(n):
print('Hello World')
留大的单位(留n方,不留n),一个大概的时间
# O(n*n*n)
for i in range(n):
for j in range(n):
for k in range(n):
print('Hello World')
例题1:
while n > 1:
print(n)
n = n // 2
如n=64
,输出:64 32 16 8 4 2;2的6次方等于64;
该题的时间复杂度记为:
O
(
log
2
n
)
或者
O
(
l
o
g
n
)
O(\log_{2}{n}) 或者O(logn)
O(log2n)或者O(logn)
-
小结:
-
时间复杂度是用来估计算法运行时间的式子(单位)。
-
一般来说(机器差不多 规模差不多),时间复杂度高的算法比复杂度低的算法慢。
-
常见的时间复杂度(按效率排序)
O ( 1 ) < O ( l o g n ) < O ( n ) < O ( n l o g n ) < O ( n 2 ) < O ( n 2 l o g n ) < O ( n 3 ) O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^2logn)<O(n^3) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3) -
复杂问题的时间复杂度
O ( n ! ) O ( 2 n ) O ( n n ) . . . . . . O(n!) O(2^n) O(n^n) ...... O(n!)O(2n)O(nn)......
-
二、简单判断时间复杂度
-
如何判断算法复杂度
-
快速判断算法复杂度(适用于绝大多数简单情况):
- 确定问题规模
n
; - 循环减半过程—>
logn
; - k层关于n的循环—>
n^k
;
- 确定问题规模
-
复杂情况:根据算法执行过程判断。
-
三、空间复杂度
-
空间复杂度:用来评估算法内存占用大小的式子
-
空间复杂度的表示方式与时间复杂度完全一样
- 算法使用了几个变量:
O(1)
- 算法使用了长度为n的一维列表:
O(1)
- 算法使用了m行n列的二维列表:
O(mn)
- 算法使用了几个变量:
-
“空间换时间”