我在学校 Al 项目工作,一切都很好,但有点慢。
在我的项目中,我重写了 equals 方法。
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
} else if (obj instanceof map) {
map m = (map) obj;
for (int i = 0; i < mapSize; i++) {
for (int j = 0; j < mapSize; j++) {
if (m.board[i][j] != board[i][j])
return false;
}
}
}
return true;
}
我发现如果我以交叉方式编写 for 循环来检查数组的前半部分,80% 的时间会在前半部分通过,剩下的 20% 我会在之后检查。所以我认为它的工作速度会快 50%
for (int i = 0; i < mapSize; i++) {
for (int j = i%2 ; j < mapSize; j+=2) {
if (m.board[i][j] != board[i][j])
return false;
}
}
for (int i = 0; i < mapSize; i++) {
for (int j = (i+1)%2 ; j < mapSize; j+=2) {
if (m.board[i][j] != board[i][j])
return false;
}
}
在划分 for 循环和几次测试之后,它似乎变得越来越慢,我不知道为什么。为什么花费太多时间以及如何让它更快
提前致谢
最佳答案
从理论角度来看,不可能在小于 O(n*m) 的时间内比较两个二维数组,其中 n = 行数,m = 列数。
但是,在您的情况下,可以跟踪您正在使用的“板”,并且假设它们一开始是相同的,则只需要跟踪在每个板上执行的操作,直到操作将其中一个板与其他板分开更改为止。
关于java - 使二维数组不等式检查更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49805098/