以对数时间计算斐波那契数列

在基础课程“数据科学的数学”开始前夕 ,我们邀请您注册一个免费的演示课程,该课程将由我们的专家进行。

现在,我们提供有用文章的翻译。


. , . ? .

?

, n- . - 1 1. - 2, - 3, 5, 8 . .

?

, . , , ( n-1 n-2).

// calculates nth term of fibonacci, 1 indexed
Procedure Fib_Naive(int n):
    if(n < 3):
        return 1;
        end_if
    return Fib_Naive(n-1) + Fib_Naive(n-2)
end_Fib_Naive

, , , .

(temp) , , , ( , , ).

// calculates nth term of fibonacci, 1 indexed
Procedure Fib(int n):
        if(n < 3): return 1;
        int prev = 1;
        int cur = 1;
        for i = 3...n:
            int temp = cur;
            cur += prev;
            prev = temp;
        end_for
return cur;
end_Fib

, .

, , :

如上所示,任何矩阵与单位矩阵的乘积等于矩阵本身,反之亦然。
, , .



, :

这样的矩阵(在中心)称为置换矩阵。
( ) .

, 2x1 (a, b). ? , (a + b).

. ? a ((n-1)-) , b .

.

, n- (0, 1), n- .

?

: . , n , , .

, 8- , , 4- , . , 8 .

, :

, , Java ( , ).

, - , , :

public int fib(int N) {
        if(N == 0) return 0;
        int[] sol = fibHelp(N);
        
        return sol[1];
    }
    
    public int[] fibHelp(int n) {
        if(n == 1) {
            return new int[] {0,1};
        }
        int m = n/2;
        
        int[] temp = fibHelp(m);
        
        int fPrev = temp[0];
        int fCur = temp[1];
        
        int prev = (fPrev * fPrev) + (fCur * fCur);
        int cur = fCur * (2 * fPrev + fCur);
        int next = prev + cur;
        
        if(n % 2 == 0) { 
            return new int[] {prev, cur};
        }
        else {
            return new int[] {cur, next};
        }
    }

*: , , , : .

O(n log(n)). . , .


.




All Articles