算法
算法:一个计算过程,解决问题的方法
程序=数据结构加算法
时间复杂度
评估算法运行效率
O(1)
print('Hello World')
print('Hello World')
print('Hello Python')
print('Hello Algorithm')
O(n)
for i in range(n):
prnt('Hello World')
for i in range(n):
print('Hello World')
for j in range(n):
print('Hello World')
O( n 2 n^{2} n2)
for i in range(n):
for j in range(n):
prnt('Hello World')
O( n 3 n^{3} n3)
for i in range(n):
for j in range(n):
for k in range(n):
prnt('Hello World')
1 1 1, n n n, n 2 n^{2} n2, n 3 n^{3} n3···都是单位,不能进行相加等运算
O( log n \log n logn)或O( log 2 n \log_{2}{n} log2n)
while n>1:
print(n)
n=n//2
如果n=64,输出为:
64
32
16
8
4
2
6个数
2
6
=
64
,
l
o
g
2
64
=
6
2^{6}=64,log_{2}{64}=6
26=64,log264=6
所以时间复杂度为O(
log
n
\log n
logn)或O(
log
2
n
\log_{2}{n}
log2n)——当算法出现循环折半时
l
o
g
n
logn
logn
小结
- 时间复杂度是用来估计算法运行时间的式子(单位)
- 常见时间复杂度
- O(1)<O( log n \log n logn)<O( n n n)<O( n log n n\log n nlogn)<O( n 2 n^{2} n2)<O( n 2 log n n^{2}\log n n2logn)<O( n 3 n^{3} n3)
- 复杂问题的时间复杂度——不常见
- O( n ! n! n!) O( 2 n 2^{n} 2n) O( n n n^{n} nn)···
空间复杂度
- 用来评估算法内存占用大小的式子
- 表示与时间复杂度相同
- 算法使用了几个变量 O(1)
- 算法使用了长度为n的一维列表 O( n n n)
- 算法使用了m行n列的二维列表 O( m n mn mn)
- ”空间换时间“
∵ \because ∵ 时间比空间重要
递归
特点
- 调用自身
- 结束条件
def func(x):
if x>0:
print(x)
func3(x-1)
汉诺塔问题
- 将n个盘子分为上面(n-1)个和最下面一个
- 将(n-1)个盘子从A经过C移动到B
- 将第n个盘子移动到C
- 将(n-1)个盘子从B经过A移动到C
代码
def hanoi(n,a,b,c): # 将n个盘子从a经过b移动到c
if n>0: # 结束条件
hanoi(n-1,a,c,b) # 将(n-1)个盘子从a经过c移动到b
print("moving from %s to %s"%(a,c))
hanoi(n-1,b,a,c)
∴ h ( x ) = 2 h ( x − 1 ) + 1 \therefore h(x)=2h(x-1)+1 ∴h(x)=2h(x−1)+1