【发布时间】:2017-06-08 18:36:29
【问题描述】:
我正在研究一种算法来确定井字游戏模型是否有赢家。不过有一点点扭曲——函数has_won?被多次调用。因此,我正在阅读的书中算法问题的作者(Cracking the Coding Interview)建议生成 2^9 个可能的表中的每一个并将它们散列到一个表中。
为了为每个排列生成唯一的键,她将每个板表示为一个整数(板最初是一个 char 数组)。整数生成如下: (3^0)v0 + (3^1)v1 + (3^2)v2+...+(3^8)v8 如果空间为空,则 v 为 0,如果是 X,如果是 O,则为 2。
这就是我没有关注的内容。我明白她为什么要这么做。但是,如何保证在大约 20,000 个可能的板上不会有另一个板与该表示不共享相同的整数键值?她没有提供证据,我无法直观地理解为什么这是一个独特的数字。
【问题讨论】:
-
有 3^9(不是 2^9)种可能的组合,给出 19683 种可能性(实际上更少,因为有些像 5x&2o 是不可能的,但是对于这个小数字,您不妨将它们全部包含并标记不可能的事情是没有胜利的)。一个普通的散列是完全没有必要的,因为你也可以只提供 19683 个桶来获得一个最小的完美散列。话虽如此,我不相信哈希是个好主意。最多只需要 8 个
if语句(如果考虑到最后一步,则更少)来检查获胜者,散列板以提供密钥不太可能更快。 -
这是一个 9 位、以 3 为底的数字。就像任何以 10 为底的整数都有唯一的二进制表示一样,任何以 3 为底的数字也是如此。
标签: algorithm data-structures hashtable