一个数学公式求解的优化
2013-02-14 22:16
295 查看
今天学长给了一道算法优化题让我做了一下,感觉还是比较有意思的~
题目是这样:
给定一个长度为n的数组I,一个数c,按下面的公式求出给定的矩阵II:
![](http://www.abandonzhang.com/wp-content/uploads/2013/02/QQ截图20130214215002.bmp)
分析:
①.按公式求.
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)
暂时只想到这个优化……欢迎大牛补充~~~
题目是这样:
给定一个长度为n的数组I,一个数c,按下面的公式求出给定的矩阵II:
![](http://www.abandonzhang.com/wp-content/uploads/2013/02/QQ截图20130214215002.bmp)
分析:
①.按公式求.
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; }
相关文章推荐
- 一个数学公式求解的优化
- 推荐一个Markdown数学公式编辑器——Haroopad & Mathjax
- 数学建模一 单变量优化和求解 进退搜索法
- 数学建模二 单变量优化和求解 黄金分割法
- 编程优化数学组合排列公式取模实现
- 数学建模三 单变量优化和求解 牛顿迭代法
- Asp.net 图片等比例生成缩略图,外带一个数学公式
- hdu 5203 截断木棍组成三角形的种数 数学公式求解
- 一行数学公式,在这个公式里有N个括号,其中各括号可以互相嵌套,请你写一个函数找出指定的第N个括号中的全部内容。
- Sumdiv 数论提 (数学很重要),这道题中算法变成了次要因素,数学才是最重要的,注意其中的一个经典公式(求因数和的)(很好推导)
- Asp.net 图片等比例生成缩略图,外带一个数学公式
- 一个小的数学期望的公式变换
- 如何递推求解一个随机变量的数学期望?(以题为例)
- 人工智能里的数学修炼 | 约束问题的优化求解:拉格朗日乘子法、KKT条件与对偶问题
- 发现了一个数学公式解析类,共享一下。
- 一个数的因子个数求解公式
- 数学建模专栏 | 第五篇:MATLAB优化模型求解方法(上):标准模型
- poj 1160 Post Office dp(序列划分,数学公式, 中偏弱,可优化)
- 利用数学里的一个漏洞(1=0.9(9循环))来验证JAVA的编译优化
- 约瑟夫环---数学公式求解