我有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/

10-12 05:19