算法——杂类 (转载)
问题:
T( 0 ) = 1 ; T(1)=1;T(2)=2;T(n)=T(n-1)+T(n-2)+T(n-3);
用最优方式求T(n) ;
int T(int n) {
}
注:以下采用的是Python
方法一:
#!/usr/bin/python
def T(n):
if n == 0:return 1
elif n == 1:return 1
elif n == 2:return 2
else:
i = 3
a = 1
b = 1
c = 2
while i <= n:
d = a + b + c
i = i + 1
a = b
b = c
c = d
return d
import sys
print T(int(sys.argv[1]))
方法二:
还有更好的方法,楼上的方法都是O(n)时间的,可以用矩阵相乘写出O(log(n))时间的
其中乘方可以用log(n)时间实现
同二楼的简单比较一下:
在n>800时候更快:
T( 0 ) = 1 ; T(1)=1;T(2)=2;T(n)=T(n-1)+T(n-2)+T(n-3);
用最优方式求T(n) ;
int T(int n) {
}
注:以下采用的是Python
方法一:
#!/usr/bin/python
def T(n):
if n == 0:return 1
elif n == 1:return 1
elif n == 2:return 2
else:
i = 3
a = 1
b = 1
c = 2
while i <= n:
d = a + b + c
i = i + 1
a = b
b = c
c = d
return d
import sys
print T(int(sys.argv[1]))
方法二:
还有更好的方法,楼上的方法都是O(n)时间的,可以用矩阵相乘写出O(log(n))时间的
代码: | |
| 7 4 2 | | 1 1 0 |^(n-4) | T(n) T(n-1) T(n-2) | | 4 2 1 | * | 1 0 1 | = | T(n-1) T(n-2) T(n-3) | | 2 1 1 | | 1 0 0 | | T(n-2) T(n-3) T(n-4) | |
其中乘方可以用log(n)时间实现
代码: |
def mul(A,B): n = len(A) C = [[0]*n for i in range(n)] for i in range(n): for j in range(n): C[i][j] = sum([A[i][k]*B[k][j] for k in range(n)]) return C def power(A, n): if n == 1: return A tmp = power(A, n/2) if n%2: return mul(mul(tmp,tmp),A) else: return mul(tmp,tmp) def T2(n): if n == 0: return 1 if n == 1: return 1 if n == 2: return 2 if n == 3: return 4 if n == 4: return 7 init = [[7,4,2],[4,2,1],[2,1,1]] unit = [[1,1,0],[1,0,1],[1,0,0]] return mul(init, power(unit,n-4))[0][0] |
同二楼的简单比较一下:
代码: |
from time import time def test(n): start = time() # linear a = T(n) end = time() print 'linear:\t', end - start #log start = time() b = T2(n) end = time() print 'log:\t', end - start |
在n>800时候更快:
代码: |
>>> test(10) linear: 1.81198120117e-05 log: 0.000334024429321 >>> test(100) linear: 0.0001380443573 log: 0.000746011734009 >>> test(1000) linear: 0.0025589466095 log: 0.00187397003174 >>> test(10000) linear: 0.158092975616 log: 0.0290448665619 >>> test(100000) linear: 5.38085889816 log: 0.533372163773 >>> |