1、用途程序員
矩陣的一個重要的用途是進行遞歸是的計算,最明顯的就是快速求數列的某一項的值。本文也是主要講解這種算法的。算法
2、樣例數組
這方面最簡單的就是斐波那契問題了,這個相信是每一位程序員都熟知的,這裏就不介紹了。ui
3、快速冪spa
既然是快速計算那確定是不能去一步一步慢慢求,這裏咱們要用到二分的思想。求快速冪。在講解矩陣中如何使用快速冪以前咱們先講解一下如何在計算普通的冪的時候使用快速冪:code
好比咱們要計算2^100,按照普通的作法咱們是進行100次的乘法,固然是很慢的。這是咱們能夠採用二分的思想,這是咱們就能夠想要獲得這個咱們能夠是2^50*2^50,而後又能夠分紅四個2^25……這樣一直繼續下去最終在將時間複雜度下降到 O(log₂N)。首先介紹一種比較樸素的快速冪實現版本。線上一段代碼:blog
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 }
你們能夠看到這段代碼的思路很簡單,就是二分的思想。代碼雖少卻大大加快了運算的速度。遞歸
4、矩陣快速冪class
矩陣快速冪的思路和通常整數是相同的,就像咱們會把矩陣的運算類比到數的運算,這裏面的也是同樣,你只須要重載一下運算,其餘的就和上面的二分快速冪徹底同樣了。在詳細講解以前咱們先看一段實際代碼:效率
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換成了單位矩陣;
二、普通算數運算換成了矩陣運算。
其餘部分還基本是相同的。
5、用矩陣解決斐波那契問題以及淺談矩陣求解遞歸的推到
固然這個矩陣的快速冪不只運算很精巧,更加關鍵的是矩陣的用途很普遍(關於算法的Matrix67好像有篇列了十多種應用了,能夠百度之。。。)這裏我就斐波那契問題的矩陣解法爲例簡單介紹一下:
咱們知道斐波那契的遞歸表示爲
f(n)=1 (n=0,n=1)
f(n)=f(n-1)+f(n-2) (n>=2)
通常的方法都是dp或者公式法求解,效率通常,若是咱們用矩陣求解就會發現速度的到了提高。那麼究竟怎麼把矩陣和一個遞歸式聯繫起來呢。這一點在網上也有一些資料。可是我我的以爲若是不是要用高次矩陣的話,徹底不必去按那些暈暈的公式求解。掌握一點門路以後按配湊就能很快的出結論。
咱們的思路就是上面的第二個式子要可以在一個矩陣的乘式中體現出來,回憶一下矩陣乘法(弄圖太麻煩了,直接扒了一張)
因而乎對照這看看咱們以爲二位數組確定就能解決這個遞歸式了,嘗試着咱們不難的到
到這就基本完了,餘下的就是你要求那個就把後面的矩陣用快速冪連乘多少就行了,複雜度O(logn)(貌似是最快的方法求斐波那契了,直接村起來除外。。。),代碼就省了。