演算法設計與分析 最小鏈乘

2021-09-14 06:31:01 字數 1580 閱讀 4245

鏈乘問題

兩個矩陣相乘要求第乙個矩陣的列數等於第二個矩陣的行數,計算量主要由進行乘法運算的次數決定。採用標準的矩陣相乘演算法,計算am×n*bn×p,需要m*n*p次乘法運算。

矩陣相乘滿足結合律,多個矩陣相乘,不同的計算順序會產生不同的計算量。以矩陣a110×100,a2100×5,a35×50三個矩陣相乘為例,若按(a1*a2)*a3計算,則需要進行10*100*5+10*5*50=7500次乘法運算;若按a1*(a2*a3)計算,則需要進行100*5*50+10*100*50=75000次乘法運算。可見不同的計算順序對計算量有很大的影響。

矩陣鏈乘問題可描述為:給定n個矩陣,矩陣ai的維數為pi-1×pi,其中i=1,2,…,n。確定一種乘法順序,使得這n個矩陣相乘時進行乘法的運算次數最少。

由於可能的計算量非常龐大,對較大的n,用蠻力法確定計算順序是不實際的。經過對問題進行分析,發現矩陣鏈乘一具有最優子結構,即若a1*a2*…*an的乙個最優計算順序從第k個矩陣處斷開,即分為a1*a2*…*ak和ak+1*ak+2*…*an兩個子問題,則該最優解應該包含a1*a2*…*ak的乙個最優計算順序和ak+1*ak+2*…*an的乙個最優計算順序。據些構造遞迴式

式中,cost[i][j]表示ai+1*ai+2*…*aj+1的最優計算的計算代價。最終需要求解cost[0][n-1]。

問題的初始值是i=j時的值,即cost[i][j]主對角線上的值,全為0;

首先計算兩個矩陣相乘的計算量,即cost[0][1], cost[1][2], cost[2][3]…,然後再計算三個矩陣相乘的計算量,即cost[0][2], cost[1][3], cost[2][4]…

給定若干個矩陣的大小,計算並輸出鏈乘最小計算量。

其中,size sequence指每個矩陣依次的大小,如下圖中的6個矩陣大小分別為:5*10,10*3,3*12,12*5,5*50和50*6。

for(int l=2;l<=n;l++) /* 矩陣鏈的長度 */

{ for(int i=1;i<=n-l+1;i++)

{ int j=i+l-1; /* 等價於 l=j-i+1 */

m[i][j]=max;

for(int k=i;k<=j-1;k++)

{ q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];

if(q執行截圖:

RANSAC與最小二乘演算法的應用

原文 ransac的原理介紹有 最小二乘法least squares的原理介紹有 兩者的共同點都是要首先確定模型,模型分為線性模型與非線性模型。一般常見的應用是線性模型,如 f x kx t。在應用上,二者的差別是,least squares對雜訊比較敏感,演算法簡單。而ransac能去除一些雜訊的...

演算法設計與分析

輸入輸出 確定性有窮性 np類問題是非確定性計算模型下的易驗證問題類。所有可以在多項式時間內求解的判定問題構成p類問題 1 二分搜尋技術 二分搜尋演算法的基本思路是對給定已排好序的n個元素a 0 n 1 在這n個元素中找出乙個特定元素x。運用分治的思想,將n個元素以n 2為中心對半分。if x a ...

演算法分析與設計

分析,此題可以用動態規劃來做。子問題為 max i max i 1 0 max i 1 nums i nums i max i 表示以nums i 結尾的子串的最大和,最後返回最大的那個即為所求,複雜度為o n class solution return max 另一種實現方法,更加簡潔,即從前往後...