专注于技术 心无旁骛 - justforfan528

Linux技术| 网络编程coding | 网络安全Cyber Security | study |

 

导航

算法——杂类 (转载)

问题:
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
>>>

posted on 2007-03-22 14:54  游荡者  阅读(351)  评论(0编辑  收藏  举报