我正在实现一个只有两种类型的棋盘,并且正在寻找一个从该棋盘映射到长整数(64位)的功能。我认为这不应该太难,因为一个长整数包含比8 * 8数组更多的可用信息(称为grid [x] [y]),每个点只包含3个可能的元素,包括空元素。我尝试了以下方法:
(1)Zobrist哈希与Longs而不是ints(只是为了测试 - 我实际上并没有期望它能够完美地工作)
(2)将网格转换为基本3的64个字符的字符串号码,然后把这个数字解析成一个长整数。我认为这应该起作用,但花了很长时间。
是否有一些更简单的方法来解决(2)涉及位移操作或类似的操作?
编辑:请不要给我实际的代码,因为这是一个类项目,这可能在我们的部门被认为是不道德的(或者至少不是在Java中)。编辑2:基本上,任何时候在棋盘上只有10个白人和10个黑人,其中任何两个相同颜色的棋子在水平,垂直或对角线方向上都不可能是邻居。另外,每种颜色只有12个空格,只有该颜色可以放置棋子。8乘8板的完美散列函数?
回答
如果游戏中的每个瓦片可以在游戏中的任何点是任意3个状态的1,散列游戏板的每个可能的状态时,在任何给定所需的“完美散列”存储的,那么最小量瞬间将
=功率(3,8 * 8)个别散列
= log2(3^64)位
=约。 101.4位,所以你将需要至少102位来存储这个信息
在这一点上,你可能只是说,每个瓷砖有4个州,这将使您需要128 bits。
一旦你这样做了,就很容易为电路板制作一个快速的散列算法。
E.g.(writtin如C++,可能需要改变代码,如果平台不支持128张的数)
uint_128 CreateGameBoardHash(int (&game_board)[8][8])
{
uint_128 board_hash = 0;
for(int i = 0; i < 8; ++i)
{
for(int j = 0; j < 8; ++j)
{
board_hash |= game_board[i][j] << ((i * 8 + j) *2);
}
}
return board_hash;
}
此方法将仅在102位的最优解废物26个比特(略多于3个字节),但您将节省大量的处理时间,否则这些处理时间将花费在基础3数学上。
编辑这里是不需要128位,应该在任何16位(或更高)处理器工作
struct GameBoardHash
{
uint16 row[8];
};
GameBoardHash CreateGameBoardHash(int (&game_board)[8][8]) { GameBoardHash board_hash; for(int i = 0; i < 8; ++i) { board_hash.row[i] = 0; for(int j = 0; j < 8; ++j) { board_hash.row[i] |= game_board[j] << (j*2); } } return board_hash; }
当你有一个预定义的输入和需要
它不适合64位整数。你有64个正方形,你需要超过1位来记录每个正方形。为什么你需要它来适应64位int?你瞄准的是ZX81吗?
如何处理包含位的16字节数组?每个2位代表一个位置的值,因此给定8x8板上的位置(pos = 0-63),您可以通过将pos除以4来计算出索引,并且可以通过位操作来获取该值以获得两个比特(比特0 =正模4和比特1 =比特0 + 1)。这两个位可以是00,01,或10
阅读您的意见大卫,它似乎并不像你真的需要一个完美的哈希值。你只需要一个可哈希对象。
使简单留给自己......做一些散为您在覆盖位置的GetHashCode(),然后做的Equals功能工作的其余部分。
如果你真的需要它是完美的,那么你必须使用GUID来编码数据中,使自己的哈希值,可以使用128位密钥。但这只是一个很小的投资时间。
- 1. 完美的散列函数和福利
- 2. 完美散列函数的定义
- 3. 大整数整数的完美散列函数[1..2^64-1]
- 4. 给定了一个完美的散列函数,计算包含
- 5. 完美的散列函数是否保证没有碰撞?
- 6. 保留最小完美散列函数的顺序
- 7. 通过固定长度输入验证完美散列函数
- 8. 将页面分成8个完美的流体列?
- 9. 轻量级8字节散列函数算法
- 10. 将bl乘以8
- 11. 内存地址近完美或完美散列c
- 12. 从模板odoo 8调用python函数
- 13. 练习使完美阶乘
- 14. 序列化Java中的Java函数8
- 15. 完美的哈希函数
- 16. 没有这样的东西作为一个完美的散列函数?
- 17. 为什么要乘以8乘以Flash?
- 18. 4位乘以8位汇编乘法
- 19. IE 7和8中未示出完美的设计视图
- 20. 在IE 8上的保证金错误,但在Firefox上完美
- 21. iOS中嵌套的UITableview行高不能完美更新8
- 22. 数据模板wp7/8
- 23. UTF-8的htmlspecialchars()函数
- 24. 完美转发仿函数
- 25. PHP - 从一个整数生成一个8字符的散列
- 26. Windows Phone 8和Windows 8平板电脑
- 27. 打印在8×8阵列
- 28. 404 Handler挂在ColdFusion 10上,在ColdFusion上完美工作8
- 29. 散列函数
- 30. 美国电话号码的良好散列函数?
完美的混编使用版本将短值映射到完成的输出。在你的情况下,似乎更像是你正在寻找一个编码方案来存储你的值。 你有8 * 8个单元格,每个单元格有3个不同的值。对于没有压缩方案的64位而言太多了。然而,很难说如果不知道更多关于那里有多少件,或者它们如何在板上分布,那么好的算法会是什么。 – Cine 2010-11-29 07:28:41
很明显,您的编辑会对问题产生影响。但为什么坚持64位int? – 2010-11-29 07:42:46
嗯,我想如果有必要,我不介意使用更大的对象。只希望尽可能小,以免发生内存不足错误。 – Rishi 2010-11-29 07:44:31