大家早上好,我试着写一个给出N数的方法会创建一个大小为N * N的螺旋矩阵,下面的方法工作正常,但代码的执行时间约为2s当它应该在几毫秒左右时,我不知道究竟是什么让代码变得如此缓慢,你能帮我解决一下吗?谢谢。
我写了另一种方法,按照以下顺序用不同的数字称这个(spirale),并得到以下结果。
test1: n=10 execution time-> 2475ms
test2: n=5 execution time-> 7795ms
test3: n=1 execution time-> 7169ms
test4: n=0 execution time-> 7034ms
test5: n=6 execution time-> 7056ms
public static int[][] spirale(int N){
int i=0, j=0, giro = 0, numbers = 1;
int mat[][] = new int[N][N];
while(true){
for(j=0+giro; j<N-giro; j++){
if(numbers>N*N) return mat;
mat[i][j] = numbers++;
}
j--;
for(i=1+giro; i<N-giro ; i++){
if(numbers>N*N) return mat;
mat[i][j] = numbers++;
}
i--;
for(j=N-2-giro; j>=0+giro; j--){
if(numbers>N*N) return mat;
mat[i][j] = numbers++;
}
j++;
for(i=N-2-giro ; i>0+giro ; i--){
if(numbers>N*N) return mat;
mat[i][j] = numbers++;
}
i++;
giro++;
}
}
答案 0 :(得分:0)
一般来说:
test4: n=0 execution time-> 7034ms
表明问题不在spirale
方法中,因为它会在第一次迭代中立即返回:
if(numbers>N*N) return mat;
我想你应该在你的代码中查看它(你需要在代码中测量它,而不仅仅是由于进程创建开销而导致的程序执行时间)
无论如何,这对你使用的小N来说并不重要,但你需要只计算一次N * N.我想编译器优化会为你完成工作。
我的意思是:
int squareN = N*N;
while(true){
for(j=0+giro; j<N-giro; j++){
if(numbers>squareN ) return mat;
mat[i][j] = numbers++;
}
j--;
for(i=1+giro; i<N-giro ; i++){
if(numbers>squareN ) return mat;
mat[i][j] = numbers++;
}
i--;
for(j=N-2-giro; j>=0+giro; j--){
if(numbers>squareN ) return mat;
mat[i][j] = numbers++;
}
j++;
for(i=N-2-giro ; i>0+giro ; i--){
if(numbers>squareN ) return mat;
mat[i][j] = numbers++;
}
i++;
giro++;
}