返回主目录
这是一个系列的文章,点击返回综合目录页
归并排序(merge sort)复杂度计算
举一个栗子说明算法思路:
简化上述流程,并给出复杂度,假设需要计算的复杂度为T(n):
用 主定理(Master Theorem) 解答:
代入计算:
斐波那契数 (Fibonanci number)复杂度计算
序列为1, 1, 2, 3,5,8, 13, 21,…
问:怎么求出序列中的第N个数?
f(n)= f(n-2)+ f(n-1)
def fib(n) :
if n<3:
return 1
return fib(n-2)+fib(n-1)
print (fib(8) )
时间复杂度:O(2^n)
空间复杂度:O(n)
循环实现:
通过维护一个数组:
import numpy as np
def fib2(n) :
tmp = np.zeros(n)
tmp[0] = 1
tmp[1] = 1
for i in range(2,n) :
tmp[i] = tmp[i-2]+tmp[i-1]
return tmp[n-1]
改进版本,只维护前两个值:
def fib3(n):
a, b = 1, 1
result = 0
for i in range(2, n):
result = a + b
a = b
b = result
return result
利用公式,到达时间复杂度 O(1)
由:
F
(
n
)
=
c
1
x
1
n
+
c
2
x
2
n
F(n) = c_1x_1^n + c_2x_2^n
F(n)=c1x1n+c2x2n
x
1
=
1
+
5
2
,
x
2
=
1
−
5
2
x_1=\frac{1+\sqrt{5}}{2}, x_2=\frac{1-\sqrt{5}}{2}
x1=21+5,x2=21−5
c
1
=
1
5
,
c
2
=
−
1
5
c_1=\cfrac{1}{\sqrt{5}}, c_2=-\cfrac{1}{\sqrt{5}}
c1=51,c2=−51
得出:
F
(
n
)
=
1
5
[
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
]
F(n) = \cfrac{1}{\sqrt{5}}\left[(\frac{1+\sqrt{5}}{2})^n - (\frac{1-\sqrt{5}}{2})^n \right]
F(n)=51[(21+5)n−(21−5)n]
代码表示 :
def fib4(n):
a = math.sqrt(5)
return (math.pow((1 + a) / 2, n) - math.pow((1 - a) / 2, n)) / a