2010-11-29 65 views
1

我正在實現一個只有兩種類型的棋盤,並且正在尋找一個從該棋盤映射到長整數(64位)的功能。我認爲這不應該太難,因爲一個長整數包含比8 * 8數組更多的可用信息(稱爲grid [x] [y]),每個點只包含3個可能的元素,包括空元素。我嘗試了以下方法:
(1)Zobrist哈希與Longs而不是ints(只是爲了測試 - 我實際上並沒有期望它能夠完美地工作)
(2)將網格轉換爲基本3的64個字符的字符串號碼,然後把這個數字解析成一個長整數。我認爲這應該起作用,但花了很長時間。
是否有一些更簡單的方法來解決(2)涉及位移操作或類似的操作?
編輯:請不要給我實際的代碼,因爲這是一個類項目,這可能在我們的部門被認爲是不道德的(或者至少不是在Java中)。編輯2:基本上,任何時候在棋盤上只有10個白人和10個黑人,其中任何兩個相同顏色的棋子在水平,垂直或對角線方向上都不可能是鄰居。另外,每種顏色只有12個空格,只有該顏色可以放置棋子。8乘8板的完美散列函數?

+2

完美的混編使用版本將短值映射到完成的輸出。在你的情況下,似乎更像是你正在尋找一個編碼方案來存儲你的值。 你有8 * 8個單元格,每個單元格有3個不同的值。對於沒有壓縮方案的64位而言太多了。然而,很難說如果不知道更多關於那裏有多少件,或者它們如何在板上分佈,那麼好的算法會是什麼。 – Cine 2010-11-29 07:28:41

+0

很明顯,您的編輯會對問題產生影響。但爲什麼堅持64位int? – 2010-11-29 07:42:46

+0

嗯,我想如果有必要,我不介意使用更大的對象。只希望儘可能小,以免發生內存不足錯誤。 – Rishi 2010-11-29 07:44:31

回答

2

如果遊戲中的每個瓦片可以在遊戲中的任何點是任意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; }

當你有一個預定義的輸入和需要
0

它不適合64位整數。你有64個正方形,你需要超過1位來記錄每個正方形。爲什麼你需要它來適應64位int?你瞄準的是ZX81嗎?

0

如何處理包含位的16字節數組?每個2位代表一個位置的值,因此給定8x8板上的位置(pos = 0-63),您可以通過將pos除以4來計算出索引,並且可以通過位操作來獲取該值以獲得兩個比特(比特0 =正模4和比特1 =比特0 + 1)。這兩個位可以是00,01,或10

0

閱讀您的意見大衛,它似乎並不像你真的需要一個完美的哈希值。你只需要一個可哈希對象。

使簡單留給自己......做一些散爲您在覆蓋位置的GetHashCode(),然後做的Equals功能工作的其餘部分。

如果你真的需要它是完美的,那麼你必須使用GUID來編碼數據中,使自己的哈希值,可以使用128位密鑰。但這只是一個很小的投資時間。