在C中快速/有效地识别两个2D阵列的相同性

时间:2017-10-30 21:34:44

标签: c arrays comparison heuristics 8-puzzle

我正在研究一个搜索算法项目,找到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]

但是,如果列表中有数百或数千个板,则以这种方式比较它们是不可取的。

有没有办法快速或有效地比较两块板的相同性?

2 个答案:

答案 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;
}