一个数学公式求解的优化

今天学长给了一道算法优化题让我做了一下,感觉还是比较有意思的~ 题目是这样: 给定一个长度为n的数组I,一个数c,按下面的公式求出给定的矩阵II: QQ截图20130214215002   分析:   ①.按公式求. 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;
}
 
举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
原文地址:https://www.cnblogs.com/AbandonZHANG/p/4114001.html