我正在實現一個只有兩種類型的棋盤,並且正在尋找一個從該棋盤映射到長整數(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. 內存地址近完美或完美散列c
- 8. 從模板odoo 8調用python函數
- 9. 練習使完美階乘
- 10. 序列化Java中的Java函數8
- 11. 爲什麼要乘以8乘以Flash?
- 12. 完美的哈希函數
- 13. iOS中嵌套的UITableview行高不能完美更新8
- 14. 在IE 8上的保證金錯誤,但在Firefox上完美
- 15. Windows Phone 8和Windows 8平板電腦
- 16. 完美轉發仿函數
- 17. PHP - 從一個整數生成一個8字符的散列
- 18. 404 Handler掛在ColdFusion 10上,在ColdFusion上完美工作8
- 19. AJAX負載函數即8
- 20. 轉換成Java 8函數
- 21. 爲(字符串)散列函數選擇乘數
- 22. 完美哈希函數的URL
- 23. 完美轉發和模板
- 24. 拆分字符串並乘以8
- 25. 什麼是Java 8中的字符串鍵的替代散列?
- 26. 問題的散列函數:散列(1)==散列(1.0)
- 27. 散列函數.NET
- 28. Java SE 8完全崩潰
- 29. 如何在matlab中製作一個8乘8的矩陣爲2乘32的矩陣
- 30. 當前生成MD5散列(Java 8/9)的方式
完美的混編使用版本將短值映射到完成的輸出。在你的情況下,似乎更像是你正在尋找一個編碼方案來存儲你的值。 你有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