我有2个大型2d数组,它们是100s * 100s。有一个大循环可以多次执行该操作。内部有3个循环;第一个循环在arr1
中存储arr2
中每个单元的总和与数字相乘,第二个循环将2个数组流传输到文件中,而第三个循环在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秒。我应该如何优化代码以使其在最快的时间内工作。
最佳答案
您可以使用第3个数组临时存储arr2的数组值,以便下次运行。
第一个循环完成后,您可以使用临时数组覆盖arr2-这样,您就不需要第二个循环。您将节省一半的时间。
for (n=0;n<x;n++)
{
for (i=0;i<maxi;i++)
{
for (j=0;j<maxj;j++)
{
arr1[i][j]=(arr2[i+1][j]+arr2[i-1][j]+arr2[i][j+1]+arr2[i][j-1])*1.5;
arr_tmp[i][j] = (arr1[i][j]+arr2[i][j])*0.5;
}
}
arr2 = arr_tmp;
}
关于c++ - 通过2d阵列C++传播的最快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16258649/