兩個矩陣的乘法學過線性代數的都知道怎麼求,一般來說複雜度為o(n^3).直接給出標準的演算法
**:
public
class martixmultiply
public
static
void
main(string args) , };
int b = , };
int c = multiply(a, b);
system.out.println(c[0][0] + " " + c[0][1] + " " + c[1][0] + " "
+ c[1][1]);
}}
strassen提出了演算法打破了o(n^3)的屏障.用到分治演算法,把矩陣分為4塊.
其中
可以得到遞推關係t(n)=7t(n/2)+o(n²),依據主定理得到解t(n)=o(n^2.81).
這兒不做出證明,顯然這用到了分治法的思想
**:
public
class martixmultiply
// /分割得到子矩陣
private
static
int divide(int a, int flag)
return result;
} // 矩陣加法
private
static
int addarrays(int a, int b)
}return result;
} // 矩陣減法
private
static
int subarrays(int a, int b)
}return result;
} // 將b複製到a的指定位置
private
static
void
merge(int a, int b, int flag)
} // 常規做法
public
static
int multiply(int a, int b)
public
static
void
main(string args) , , ,
};int b = , , ,
};int c = multiply(a, b);
system.out.println(c[0][0] + " " + c[0][1] + " " + c[1][0] + " "
+ c[1][1]);
}}
Strassen矩陣相乘演算法
strassen的矩陣相乘方法是一種典型的分治演算法。目前為止,我們已經見過一些分治策略的演算法了,例如歸併排序和karatsuba大數快速乘法。現在,讓我再來看看分治策略的背後是什麼。同動態規劃不同,在動態規劃中,為了得到最終的解決方案,我們經常需要把乙個大的問題 展開 為幾個子問題,但是這裡,我...
矩陣乘法 之 strassen 演算法
一般情況下矩陣乘法需要三個for迴圈,時間複雜度為o n 3 現在我們將矩陣分塊如圖 來自mit演算法導論 一般演算法需要八次乘法 r a e b g s a f b h t c e d g u c f d h strassen將其變成7次乘法,因為大家都知道乘法比加減法消耗更多,所有時間複雜更高!...
演算法導論 矩陣乘法strassen演算法
矩陣運算在做科 算時是必不可少的,如果採用matlab來計算,這倒也容易。但是如果是自己寫c或者c 一般而言,需要做三次迴圈,其時間複雜度就是o n 3 上圖給出了我們一般會採用的方法,就是對應元素相乘和相加。如果把c a b進行分解,可以看出,這裡需要進行8次的乘法運算 分別是 r a e b g...