我有一个这样的循环(q = 20000
,m = n = 200
,实际上不同的k
有不同的qx
,qy
,dx
数组,dy
。但是我没有在这里发布所有代码):
double[][] ED = new double[n][m];
for(int k = 0; k < q; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
ED[i][j] = dis(qx[i], qy[i], dx[j], dy[j]);
这个循环花费大约5s
。
&#34; DIS&#34;是计算(x1,y1)
和(x2,y2)
之间距离的函数。不要介意。
问题是当我在循环中添加另一个赋值时,就像这样:
double[][] ED = new double[n][m];
boolean[][] bool = new boolean[n][m];
for(int k = 0; k < q; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
ED[i][j] = dis(qx[i], qy[i], dx[j], dy[j]);
bool[i][j] = ED[i][j] > 5000;
}
我想知道ED[i][j]
是否大于5000,所以做一个简单的比较。但新版本代码的运行成本约为8秒。我认为花费这么多时间是不可能的。但我尝试了很多方法,却未能找到问题所在。我希望有人可以帮助我。非常感谢你。这里的代码不完整,但我保证除了添加一个简单的句子之外什么都不做。即使我添加bool[i][j] = true;
,也需要额外费用1.5s
。
答案 0 :(得分:1)
由于k = 2000 m = n = 200,因此内环即
ED[i][j]=dis(qx[i], qy[i], dx[j], dy[j]);
bool[i][j]=ED[i][j]>5000;
这将重复近2000×200×200 = 800000000次!在如此多的迭代中,即使是简单的数组检查或布尔分配也会耗费大量时间。