5
次のコードを検討してください。 unordered_mapで使用されるKeyの配列に対する適切なハッシュ関数は何ですか?トライステートの2次元配列をハッシュするには?
#include <unordered_map>
using namespace std;
enum TriState {
S0 = -1,
S1 = 0,
S2 = +1
};
struct K { // Key for the map
TriState a[8][8];
bool operator==(const K& k1) const {
for (int i = 0; i < 64; i++)
if (k1.a[0][i] != a[0][i])
return false;
return true;
}
};
struct Hash {
size_t operator()(const K& k) const {
size_t s;
// s = what is a good hash value?
return s;
}
};
unordered_map<K, int, Hash> m;
通常、ボードゲームではZobrist-hashingが使用されます。 – wildplasser
私の中のオプティマイザは、演算子==メソッドでシリングします。 64個のint読み取りがありますが、これはおそらく少しずつ手を加えて1つの16バイトの読み取りになる可能性があります。 –
@MichaelDorgan:最適化が失敗します。単に 'memcmp'を使ってコンパイラに簡略化させてください:)。 – kennytm