zoukankan      html  css  js  c++  java
  • 一个数学公式求解的优化

    今天学长给了一道算法优化题让我做了一下,感觉还是比较有意思的~ 题目是这样: 给定一个长度为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
  • 相关阅读:
    跳码与一机多终端
    SCRUM REPORT DIRECTORY
    ASE Backend Review
    ASE Beta Sprint
    ASE Beta Sprint
    ASE Backend Alpha Sprint Review
    ASE Alpha Sprint
    ASE Alpha Sprint
    ASE Alpha Sprint
    ASE Alpha Sprint
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/4114219.html
Copyright © 2011-2022 走看看