二维数组的快速散列

Joh*_*rén 8 java algorithm

我正在使用标准alpha beta修剪搜索算法构建一个Reversi播放器.我正在尝试添加转换表以在搜索树中存储先前计算的节点.所以我需要哈希表示游戏板(状态)的二维数组并存储一个值.

我不能提出任何比循环迭代我的数组并将所有值加在一起更好的东西,将它们与偏移相乘以获得唯一的哈希值.

@Override
public int hashCode() {
    if (dirtyHash) {
        int hash = 0;
        for (int i = 0; i < Board.SIZEX; i++)
            for (int j = 0; j < Board.SIZEY; j++)
                hash += board[i][j] * (i + Board.SIZEY * j);

        hashValue = hash;
        dirtyHash = false;
    }

    return hashValue;
}
Run Code Online (Sandbox Code Playgroud)

我怀疑必须有一个更聪明的方法来做到这一点?有人有任何想法吗?

par*_*tic 11

我会首先尝试使用java标准库:

int hash = java.util.Arrays.deepHashCode( board );
Run Code Online (Sandbox Code Playgroud)

一旦一切正常,请分析整个应用程序,以检查哈希码计算是否真的是性能瓶颈.


wbe*_*rry 6

如果你想自己处理这个问题,这是你可以做到的一种方法.

板上的每个单元有三个值:空,黑,白.这意味着您可以在电路板上每个单元使用两位.由于电路板是8x8或64个单元,因此您可以将电路板编码为两个long基元.也许其中一个人告诉你某个特定的细胞是否为空,如果不是,则另一个告诉你它的颜色.

您甚至不需要将此表示转换为2D数组.您可以long直接在方法中使用按位运算符来处理板.

然后,哈希值可以是两个longs 的XOR ,或类似的东西.