b442. 快取實驗 矩陣乘法
標籤 : 作業系統
通過比率 : 13人/24人 ( 54% ) [非即時]
評分方式:
Tolerant

最近更新 : 2015-07-09 16:50

內容

背景

記得 b439: 快取置換機制 提到的快取置換機制嗎?現在來一場實驗吧!

題目描述

相信不少人都已經實作所謂的矩陣乘法,計算兩個方陣大小為 $N \times N$ 的矩陣 $A, B$。為了方便起見,提供一個偽隨機數的生成,減少在輸入處理浪費的時間,同時也減少上傳測資的辛苦。

根據種子 $c = S1$ 生成矩陣 $A$,種子 $c = S2$ 生成矩陣 $B$,計算矩陣相乘 $A \times B$,為了方便起見,使用 hash 函數進行簽章,最後輸出一個值。由於會牽涉到 overflow 問題,此題作為快取實驗就不考慮這個,overflow 問題大家都會相同。

請利用快取優勢修改代碼如下:

#include <bits/stdc++.h>
using namespace std;
class Matrix {
public:
vector< vector<int> > data;
int row, col;
Matrix(int n = 1, int m = 1) {
data = vector< vector<int> >(n, vector<int>(m, 0));
row = n, col = m;
}
void rand_gen(int c) {
int x = 2, n = row * col;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
x = ((long long) x * x + c + i + j)%n;
data[i][j] = x;
}
}
}
Matrix multiply(Matrix x) {
Matrix ret(row, x.col);
for (int i = 0; i < row; i++) {
for (int j = 0; j < x.col; j++) {
int sum = 0; // overflow
for (int k = 0; k < col; k++)
sum += data[i][k] * x.data[k][j];
ret.data[i][j] = sum;
}
}
return ret;
}
void print() {
for (int i = 0; i < row; i++) {
printf("[");
for (int j = 0; j < col; j++) {
printf(" %d", data[i][j]);
}
printf(" ]\n");
}
}
unsigned long signature() {
unsigned long h = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
h = hash(h + data[i][j]);
}
}
return h;
}
private:
unsigned long hash(unsigned long x) {
return (x * 2654435761LU);
}
};
int main() {
int N, S1, S2;
while (scanf("%d %d %d", &N, &S1, &S2) == 3) {
Matrix A(N, N), B(N, N), C;
A.rand_gen(S1);
B.rand_gen(S2);
C = A.multiply(B);
// A.print();
// B.print();
// C.print();
printf("%lu\n", C.signature());
}
return 0;
}
輸入說明

多組測資,每組測資一行三個整數 $N, S1, S2$。

  • $1 \le N \le 1000$
  • $0 \le S1, S2 \le 65536$
輸出說明
每組測資輸出一行,一個整數 signature 的結果。
範例輸入 #1
2 2 5
2 2 5
範例輸出 #1
573770929
573770929
測資資訊:
記憶體限制: 64 MB
不公開 測資點#0 (25%): 3.0s , <1K
不公開 測資點#1 (25%): 3.0s , <1M
不公開 測資點#2 (25%): 3.0s , <1K
不公開 測資點#3 (25%): 3.0s , <1K
提示 :

範例輸入產生 $2 \times 2$ 的矩陣。

$$ A = \begin{bmatrix}
2 & 3\\
0 & 0
\end{bmatrix}
, B = \begin{bmatrix}
1 & 3\\
3 & 0
\end{bmatrix}
, A \times B = \begin{bmatrix}
11 & 6\\
0 & 0
\end{bmatrix}$$

利用轉置矩陣讓快取更加地有效,速度可以快上 20 倍於 Zerojudge 主機。或者使用低於 $O(N^3)$ 的複雜度通過。

標籤:
作業系統
出處:
[管理者: morris1028 (碼畜) ]

本題狀況 本題討論 排行

編號 身分 題目 主題 人氣 發表日期
沒有發現任何「解題報告」