暴力分塊矩陣乘法

2021-08-22 10:38:09 字數 1208 閱讀 1045

樸素的演算法 o(4096 * 64 * 4096) = o(1e9) 不用想是超時的。

因為每次矩陣乘法中存在很多重複的計算。

考慮將矩陣進行分塊優化。預處理出每塊的值。

怎麼分塊。考慮對a矩陣的列分塊,和b矩陣的行分塊。因為p是公共的邊,且p <= 64

需要注意到的是 b矩陣中的取值僅有01那麼如果對b矩陣進行分塊的話。考慮每塊8個01串。那麼每一塊的取值為[0,255]

於是我們預處理出a[i][j][0,255]的每種取值。i表示a矩陣的i行。j表示每行的第幾塊數。[0,255]表示當前塊與所有01序列的取值。

a切完一共4096*8塊,每塊都預處理出256種情況,預處理的空間是4096*8*256,時間是4096*8*8*256。

那麼在進行乘的時候就按照分好的塊再去做乘法。時間為 4096 * 4096 * 8

#include#define rep(i,a,n) for(int i=a;i<=n;i++) 

using namespace std;

const int maxn = 4100;

int a[maxn][70],b[maxn][70];

int ra[maxn][10][260],rb[10][maxn];

char str[70];

int n,p,m;

inline void debug()

rep(i,0,p-1)

}inline void solve()

a[i][j] = temp;

}rep(i,0,m-1)

p = (p-1)/8+1; //將p進行分塊,每8個一塊

rep(i,0,n-1) rep(j,0,p-1)

rep(i,0,p-1) rep(j,0,m-1)

int res = 0;

rep(i,0,n-1) rep(j,0,p-1) rep(k,0,m-1)

printf("%d\n",res);

}int main()

return 0;

}

upc 9541 矩陣乘法 (矩陣分塊)

題目描述 深度學習演算法很大程度上基於矩陣運算。例如神經網路中的全連線本質上是乙個矩陣乘法,而卷積運算也通常是用矩陣乘法來實現的。有一些科研工作者為了讓神經網路的計算更快捷,提出了二值化網路的方法,就是將網路權重壓縮成只用兩種值表示的形式,這樣就可以用一些 trick 加速計算了。例如兩個二進位制向...

BZOJ 2738 矩陣乘法 分塊

標算整體二分,然而窩太弱了並不會做。我們把n n個數排序,然後從小到大插入矩陣,每次插n個,用字首和維護每個子矩陣當前已經填了多少個數。查詢的時候 對於每個詢問,如果子矩陣裡的數已經超過了k個,說明答案在當前插入的這n個數里,倒著查詢即可。用鍊錶維護詢問,已經出解的直接跳過。因為每個詢問最多會查n次...

暴力美學 分塊

cf1017g 給定一棵樹,每次操作乙個點,如果這個點是白色就把他染黑,否則遞迴操作所有兒子。或者把乙個子樹染白。或者詢問某個點的顏色 黑白 把操作以 o n o sqrt n o n 劃分成若干段,把每段涉及到的點建一棵類似虛樹的東西,邊權是兩點之間的白點個數。修改操作在這棵樹上改,複雜度 sqr...