【发布时间】:2013-04-21 22:31:58
【问题描述】:
我有 2 个 100s*100s 的大型二维数组。它有一个大循环可以多次执行操作。里面有3个循环;在arr1 中的第一个循环存储arr2 中每个单元格的总和乘以数字,第二个循环将两个数组流式传输到一个文件,第三个循环在arr2 中存储两个数组的总和除以数字。
代码解释得更好:
for(int i=1;i<x+1;i++) {//initialize
for(int j=1;j<y+1;j++) {
arr1[i][j]=i*j*5.5;
arr2[i][j]=0.;
}
}
for (int i=0;i<x+2;i++) {//padding
vi[i][0]=5;
vi[i][y+1]=-5;
}
for (int j=0;j<y+2;j++) {//padding
vi[0][j]=10.;
vi[x+1][j]=-10.;
}
for(int t=0;t<times;++t) {
for(int i=1;i<x+1;++i) {
for(int j=1;j<y+1;j++) {
arr2[i][j]=(arr1[i+1][j]+arr1[i-1][j]+arr1[i][j-1]+arr1[i][j+1])*1.5;
}
}
arr2[1][1]=arr2[1][y]=arr2[x][1]=arr2[x][y]=0.;
for(int i=1;i<x+1;++i) {
for(int j=1;j<y+1;j++) {
arr1[i][j]=(arr1[i][j]+arr2[i][j])*0.5;
if(arr2[i][j]+arr1[i][j]>5.)
cout<<"\n"<<t<<" "<<i-1<<" "<<j-1<<" "<<arr1[i][j]<<" "<<arr2[i][j];
}
}
}
整个代码的工作时间超过 14 秒。我应该如何优化代码以尽可能快地工作。
【问题讨论】:
-
当
i在j的初始循环迭代中为零时,您会告诉我们像arr2[i-1]这样的表达式有多好。当i = (maxi-1)和您取消引用arr2[i+1]时,同样在另一端。当j最初为零并且您使用arr2[i][j-1]之类的表达式时,您会遇到类似的问题。有些事情告诉我计算时间是你最不担心的。 -
我已经编辑了代码。数组具有填充行和列,以避免边缘的特殊情况。
-
那很好,因为正如现在所写的那样,
arr1[0][0]值将被使用,但从不改变。 -
我现在对代码进行评价。
标签: c++ algorithm optimization multidimensional-array