您的位置:首页 > 其它

一个数学公式求解的优化

2013-02-14 22:16 295 查看
今天学长给了一道算法优化题让我做了一下,感觉还是比较有意思的~

题目是这样:

给定一个长度为n的数组I,一个数c,按下面的公式求出给定的矩阵II:





分析:

①.按公式求.

O( (n-c)*c^2 ),这样固然简单,但是如果给定n=2000,c=1000呢?

②.利用递推关系加速.

观察式子发现,II(k,j)和II(k-1,j-1)很相似,我们把他们展开看:

II(k,j) = Ic-k * Ic-j + Ic+1-k * Ic+1-j + …… + In-1-k * In-1-j

II(k-1, j-1) = Ic+1-k * Ic+1-j + …… + In-1-k * In-1-j + In-k * In-j

于是我们得到II(k,j) = II(k-1, j-1) - In-k * In-j + Ic-k * Ic-j

这样我们只有按公式求出k=0和j=0的元素,剩下的用上面的递推公式求就可以了,复杂度O(c*n + c^2)

暂时只想到这个优化……欢迎大牛补充~~~

#include
#include
#include
#include
#include
using namespace std;

const int MAXN = 400;
typedef struct Matrix_Calculation{
/* data */
int c, N;
vector  ArrayI;
float MatrixII[MAXN][MAXN];
string inputFilePath;

/* function */
void input_data_path();
void read_data();
void calculate_matrix_ii();
void print_matrix_ii();
}M_C;
void Matrix_Calculation::input_data_path(){
cout << "Please write down the whole path of the input data file:\n";
cin >> inputFilePath;
cout << "Please write down the c and N which you want to given us, separated by space:\n";
cin >> c >> N;
return ;
}
void Matrix_Calculation::read_data(){
ifstream readArrayI(inputFilePath.c_str());
for (int i = 0; i < N; i ++){
float tmp;
readArrayI >> tmp;
ArrayI.push_back(tmp);
}
return ;
}
void Matrix_Calculation::calculate_matrix_ii(){
for (int j = 0; j <= c; j ++){
MatrixII[0][j] = 0;
for (int i = c; i < N; i ++)
MatrixII[0][j] += (ArrayI[i] * ArrayI[i-j]);
}
for (int k = 0; k <= c; k ++){
MatrixII[k][0] = 0;
for (int i = c; i < N; i ++)
MatrixII[k][0] += (ArrayI[i-k] * ArrayI[i]);
}
for (int k = 0; k <= c; k ++){
for (int j = 0; j <= c; j ++){
if (k == 0 || j == 0)
continue;
MatrixII[k][j] = MatrixII[k-1][j-1] - ArrayI[N-k] * ArrayI[N-j] + ArrayI[c-k] * ArrayI[c-j];
}
}
return ;
}
void Matrix_Calculation::print_matrix_ii(){
cout << "The MatrixII is :\n";
for (int k = 0; k <= c; k ++){
for (int j = 0; j < c; j ++)
cout << setw(8) << left << MatrixII[k][j] << " ";
cout << setw(8) << left << MatrixII[k][c] << endl;
}
return ;
}
int main(){
M_C test;
test.input_data_path();
test.read_data();
test.calculate_matrix_ii();
test.print_matrix_ii();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: