我正在研究一个搜索算法项目,找到16个难题的解决方案。
我有两个包含2D数组board[N][N]
列表中的数字在0-15的范围内是唯一的,不同之处在于它们的顺序。
BoardA = 0 1 2 3 BoardB = 4 1 2 3
4 5 6 7 0 5 6 7
8 9 10 11 8 9 10 11
12 13 14 15 12 13 14 15
正如您所看到的,电路板之间的唯一区别是数字的顺序。 显然,可以遍历每个板检查是否
BoardA[i][j] == BoardB[i][j]
但是,如果列表中有数百或数千个板,则以这种方式比较它们是不可取的。
有没有办法快速或有效地比较两块板的相同性?
答案 0 :(得分:1)
二维数组的元素位于连续的内存块中。因此,要比较两个数组,您只需比较两个内存块。最快的方法是使用memcmp()
。您没有指定每个数组元素的类型,因此我将使用int
,如果您的元素不是int
,则可以将其替换为其他类型。
if (memcmp(BoardA, BoardB, sizeof(int) * N * N) == 0) {
/* equal */
} else {
not /* equal */
}
答案 1 :(得分:0)
您可以使用memcmp()
这样的技巧来节省几个周期,但实际上简单,直接的比较会很好地优化。如果你在失败时提前退出,那么它只会比较数组相等的情况下的所有元素,在这种情况下,无论如何都需要进行每次比较,即使使用memcmp()
。
所以保持简单:
int equals(int (*a)[4], int (*b)[4]) {
for (int i = 0; i < 4; i += 1) {
for (int j = 0; i < 4; j += 1) {
if (a[i][j] != b[i][j]) return 0;
}
}
return 1;
}