矩陣的應用


一、用途

  矩陣的一個重要的用途是進行遞歸是的計算,最明顯的就是快速求數列的某一項的值。本文也是主要講解這種算法的。

二、樣例

  這方面最簡單的就是斐波那契問題了,這個相信是每一位程序員都熟知的,這里就不介紹了。

三、快速冪

  既然是快速計算那肯定是不能去一步一步慢慢求,這里我們要用到二分的思想。求快速冪。在講解矩陣中如何使用快速冪之前我們先講解一下如何在計算普通的冪的時候使用快速冪:

  比如我們要計算2^100,按照普通的做法我們是進行100次的乘法,當然是很慢的。這是我們可以采用二分的思想,這是我們就可以想要得到這個我們可以是2^50*2^50,然后又可以分成四個2^25……這樣一直繼續下去最終在將時間復雜度降低到 O(log₂N)。首先介紹一種比較朴素的快速冪實現版本。線上一段代碼:

 1 long long  quickpow(long long  m,long long  n,int k)//取余
 2 {
 3     long long  b = 1;
 4     while (n > 0)
 5     {
 6           if (n & 1)
 7              b = (b*m)%k;
 8           n = n >> 1 ;
 9           m = (m*m)%k;
10     }
11     return b;
12 }

大家可以看到這段代碼的思路很簡單,就是二分的思想。代碼雖少卻大大加快了運算的速度。

四、矩陣快速冪

 矩陣快速冪的思路和一般整數是相同的,就像我們會把矩陣的運算類比到數的運算,這里面的也是一樣,你只需要重載一下運算,其他的就和上面的二分快速冪完全一樣了。在詳細講解之前我們先看一段實際代碼:

 1 const int MAX = 3;
 2 typedef struct
 3 {
 4     int m[MAX][MAX];
 5 }Matrix;
 6 Matrix P={5,-7,4,
 7           1,0,0,
 8           0,1,0,
 9          };
10 Matrix I={1,0,0,
11           0,1,0,
12           0,0,1,
13          };
14 Matrix matrixmul(Matrix a,Matrix b) //矩陣乘法
15 {
16        int i,j,k;
17        Matrix c;
18        for(i=0;i<MAX;i++)
19            for (j = 0; j < MAX;j++)
20              {
21                  c.m[i][j] = 0;
22                  for (k = 0; k < MAX; k++)
23                      c.m[i][j] += (a.m[i][k] * b.m[k][j])%9997;
24                  c.m[i][j] %= 9997;
25              }
26        return c;
27 }
28 Matrix quickpow(long long n)
29 {
30     Matrix m=P,b=I;
31     while(n>=1)
32     {
33         if(n&1)
34         b=matrixmul(b,m);
35         n=n>>1;
36         m=matrixmul(m,m);
37     }
38     return b;
39 }

從這段代碼中我們可以看出矩陣的快速冪與普通二分很相似,他們的不同就是數字的運算換成了矩陣的運算,說的詳細點就是說:

1、數字二分中的1換成了單位矩陣;

2、普通算數運算換成了矩陣運算。

其他部分還基本是相同的。

五、用矩陣解決斐波那契問題以及淺談矩陣求解遞歸的推到

當然這個矩陣的快速冪不僅運算很精巧,更加關鍵的是矩陣的用途很廣泛(關於算法的Matrix67好像有篇列了十多種應用了,可以百度之。。。)這里我就斐波那契問題的矩陣解法為例簡單介紹一下:

  我們知道斐波那契的遞歸表示為

    f(n)=1   (n=0,n=1)

    f(n)=f(n-1)+f(n-2)   (n>=2)

一般的方法都是dp或者公式法求解,效率一般,如果我們用矩陣求解就會發現速度的到了提升。那么究竟怎么把矩陣和一個遞歸式聯系起來呢。這一點在網上也有一些資料。但是我個人覺得如果不是要用高次矩陣的話,完全沒必要去按那些暈暈的公式求解。掌握一點門路之后按配湊就能很快的出結論。

我們的思路就是上面的第二個式子要能夠在一個矩陣的乘式中體現出來,回憶一下矩陣乘法(弄圖太麻煩了,直接扒了一張)

於是乎對照這看看我們覺得二位數組肯定就能解決這個遞歸式了,嘗試着我們不難的到

到這就基本完了,余下的就是你要求那個就把后面的矩陣用快速冪連乘多少就好了,復雜度O(logn)(貌似是最快的方法求斐波那契了,直接村起來除外。。。),代碼就省了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM