转置 table 使算法变慢(我做错了吗?)

Transposition table makes algorithm slower (am I doing it wrong?)

我用 Zobrist 密钥(64 位)存储每个位置。我将论文存储在 std::vector 中。一开始我std::vector::reserve(1,000,000)。查找某个位置时,需要很长时间检查key是否在vector中,如果在,则需要很长时间才能定位。

当换位向量变得如此长时,这种情况发生在较晚的深度,重新计算位置比寻找换位更快。

我尝试过的:

-将键插入到从小到大排序的向量中,然后使用二进制搜索来定位它们。

-将密钥推送到向量,每次我想检查一个密钥时,循环遍历向量以检查匹配的密钥。

此外,如果它有助于有效散列密钥不是问题,我已经实现了它,以便每次移动时它都会更新。

您可以使用大小为 2 的幂的向量,并屏蔽掉 Zobrist 散列的相应部分以获得向量中的索引。例如:

std::vector<whatever> x(0x100000)
std::int64_t hash = get_hash_from_somewhere();
whatever& value = x[hash & 0xFFFFF];

如果导致太多碰撞,您可能想要使用更复杂的掩码。