日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...

發布時間:2023/12/2 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

矩陣乘法的Strassen

這個算法就是在矩陣乘法中采用分治法,能夠有效的提高算法的效率。

先來看看咱們在高等代數中學的普通矩陣的乘法

兩個矩陣相乘

上邊這種普通求解方法的復雜度為: O(n3)

也稱之為暴力求解或者樸素求解

這是暴力求解的代碼,三重循環,顯然復雜度是O(n3)

voidMul(int** matrixA,int** matrixB,int** matrixC)

{

for(inti = 0; i < 2; ++i)

{

for(intj = 0; j < 2; ++j)

{

matrixC[i][j] = 0;

for(intk = 0; k < 2; ++k)

{

matrixC[i][j] += matrixA[i][k] * matrixB[k][j];

}

}

}

由于不滿足上邊這種復雜度太大,德國某位牛人開始找另外的解法了

先分析一下下邊的

將一個矩陣分成四塊

如上圖,A和B矩陣都被分成了四塊,該算法復雜度依然是n3,于是上邊那位老哥不服,他覺得這不是最優的解,還有更優的,于是他分析了上邊是四個等式,四個等式中有八個乘法,四個加法

矩陣乘法的復雜度主要就是體現在相乘上,而多一兩次的加法并不會讓復雜度上升太多。故此,老哥思考,是否可以讓矩陣乘法的運算過程中乘法的運算次數減少,從而達到降低矩陣乘法的復雜度,我們都知道,想要獲取時間上的效率,很多時候都是以空間換時間,于是老哥定義了七個變量

這七個變量均是矩陣,ABCDEFGH原來兩個相乘矩陣里邊劃分好的八個小矩陣

圖三

或者看這個圖,總之七個矩陣變量是要求的(PPT上和這差不多,只是變量順序換了)

圖四

求出則七個矩陣,就能求出A*B的值

這個圖就是A*B的值,至于為什么能求出來,歸功于牛人構造的七個巧妙的式子,利用七個式子之間的關系就求出了下邊四個變量,也就是解

圖五

最后那老哥證明了,這個復雜度是這個

圖六

順帶復習一下PPT上這個

如對于上邊圖六那個公式,a=7,k=2,b=2? 顯然7>2^2,所以套第三個T(n)

動態規劃算法

動態規劃和分治法相似,都是通過組合字問題來求解原問題,不同之處在于分治法的子問題互不干涉、互不交叉,而動態規劃相反,它會利用已經求解的子問題進而求解新的子問題

先舉個簡單的例子感受一蛤什么是動態規劃

錢幣問題——用面值1元、3元、5元的硬幣,如何用最少的硬幣湊到11塊錢?

第一步要想的就是,怎么把一個大問題變小問題

既然要求最少的硬幣湊到11塊錢,這里用c[i]=表示湊到i元最小要j個硬幣

那我先求最少的硬幣湊到0塊錢,顯然需要0個硬幣,所以才c[0]=0

接下來求最少的硬幣湊到1塊錢,現在只有面值1塊的能用,我就用一個,用完之后還需湊0元,這時才c[0]=0已知,所以才c[1]=1+c[0]=1

接下來求最少的硬幣湊到2塊錢,現在只有面值1塊的能用,我也先用一個,用完之后還需湊1元,這時才c[1]=1已知,所以c[2]=1+c[1]=2

接下來求最少的硬幣湊到3塊錢,現在有面值1塊的和三塊的,如果我先用一個3塊的,用完之后還需湊0元,這時才c[0]=0已知,所以c[3]=1+c[0]=1;如果我先用一個1塊的,用完之后還需湊2元,這時才c[2]=2已知,所以c[3]=1+c[2]=3,取這兩種中的最小的那種情況

后邊的以此類推....

矩陣鏈乘法

如果要求n個給定序列的矩陣相乘的乘積(比如ABCDEFG),矩陣具有結合律,所以計算的步驟有很多種選擇,但如果結合律用的不好會產生比較大的代價

在了解這個咱們要研究算法是干啥的之前,先了解幾個概念

1、矩陣相容:也就是兩個矩陣要能夠相乘,即A的列數等于B的行數

2、標量乘法:若A是p*q,B是 q*r,則A*B的代價就是其標量乘法,也就是pqr

所以要求n個給定序列的矩陣相乘的乘積,我們要研究使得該成績代價最小,也就是其標量乘法次數之和最少(這塊最好參照一下算法導論211頁很詳細),說白了,就是在乘法式子中如何打括號

官方的話就不說了,直接上一串矩陣,你應該干什么和怎么干,哈哈,怎么干

圖中給出了6個矩陣相乘,你應該做的就是給它大括號,決定計算順序,使得計算代價最小

這個就是m[ ][ ]的算法? ? int t= m[i][k]+ m[k+1][j]+p[i-1]*p[k]*p[j]? ? ? ? ? 、

現在來解釋一下上邊的這個算法,我只能說老師的PPT略傻逼,都沒怎么解釋

m[i][j]表示矩陣從第i個矩陣乘到第j個矩陣的最小代價

int t= m[i][k]+ m[k+1][j]+p[i-1]*p[k]*p[j] :

上邊這個算法的意思是,第i個矩陣到第k個矩陣相乘的代價+第k個矩陣到第j個矩陣相乘的代價,加上這兩個乘好了的前后兩個矩陣相乘的代價

然后理解了怎么算,從小到大算就OK了,按照斜線的順序算,i和j挨著越近越好算,先算對角線,全是0,再算m[1][2],m[2][3],m[3][4]...以此類推,因為后邊計算的斜線,會用到上一條斜線上那些數

比如算m[1][3]會用到m[1][1],m[1][2],m[2][3],m[3][3]

最后解釋一下怎么找分解點,也就是在哪打括號,下邊圖的矩陣是標記矩陣,也就是在動態規劃的過程中,你每次的最優解是在哪劃分的它會記錄下來,如果要求A[1][6]怎么打括號,找到s[1][6]=3,然后在A[1][3]和A[3][6]里重復上邊的步驟,每個找到的點都是分界點..比如第一個找到的3

【6】】

來自moonsmile的祝福~

明天將推出貪心算法

總結

以上是生活随笔為你收集整理的矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。