我想知道是否有人知道C中哈希表的良好实现。我试图做的就是哈希棋盘。我只是希望实现快速,并且能够一次性清除表。任何帮助都会得到帮助!
答案 0 :(得分:0)
在国际象棋中,它主要被称为"换位表"。它是一种比哈希表更专业的数据结构。
转置表更像是缓存。它们比传统的哈希表更快,因为它们的冲突处理要简单得多。旧条目最终被逐出。相反,除非请求,否则经典哈希表绝不能删除条目。
我不知道转置表的可重用实现。我见过的所有国际象棋引擎,带来了自己的实现。它包括两个方面:
hash
(有关详细信息,请查看Zobrist hashing)换位表本身非常简单。首先,您可以简单地使用一个大数组:
Entry* table = malloc(n * sizeof(Entry));
// ...
// clear transposition table
memset(table, 0, n * sizeof(Entry));
Position position; // the chess position
// ...
Key key = hash(position);
// probe
Entry entry = table[hash(position) % n];
if(entry.key == key)
{
// found something --> entry can be used
...
}
// store
table[hash(position) % n] = updated_entry;
更高级的转置表通常使用多个插槽,因此来自较深层搜索的条目不会被较少搜索的条目驱逐。防止多线程引擎中的数据争用也会使实际实现变得更加棘手。
以下是一些可以帮助您编写自己的链接: