使用不关心位来散列二进制数

时间:2017-01-10 18:43:12

标签: data-structures hash binary

如何判断一个集合中是否包含二进制数,该集合中的某个元素可能不关心位? 我考虑过使用哈希表,但是需要在哈希表中使用无关位来复制数字,以便涵盖所有可能性。

例如: 这组数字是:

   0  00x1
   1  10xx
   2  110x
   3  1010
   4  11x1
   5  0010

且数字为0011,结果应为0。

2 个答案:

答案 0 :(得分:3)

如果二进制数的位数有限,那么您可以复制那些不关心位并将二进制数转换为整数,然后将这些整数用作映射的键​​和其他值作为值。 实施例

  

0 00x1

     

1 10xx

可以转换为

  

0001 0

     

0011 0

     

1000 1

     

1001 1

     

1010 1

     

1011 1

并保存为

  

我j

     

1 0

     

3 0

     

8 1

     

9 1

     

10 1

     

11 1

其中i是键,j是值

答案 1 :(得分:2)

假设您有二进制数1xxx,它将匹配8个数字。所以,不要为每个选项复制。

你必须在某处保留“不关心”位。使用另一个数字,将“不关心”位设置为1.如果我们重复您的示例:

i  x       y
0  00x1    0010
1  10xx    0011
2  110x    0001
3  1010    0000
4  11x1    0010
5  0010    0000

您需要决定使用x,0或1的内容。您可以使用其中任何一个,一旦将信息保存在第二个数字中就没关系。

现在使用按位操作:

if ((n ^ x[i]) | y[i]) == y[i] then match

此解决方案基于检查除了无关位之外是否存在任何非匹配位。 (n xor x [i])给出非匹配位,然后或者用y [i]不应该与y [i]不同。

如果我们回顾一下你的例子,假设你为x选择0,则检查变为

i:0 -->> ((0011 ^ 0001) | 0010) == 0010  -->> match!
i:1 -->> ((0011 ^ 1000) | 0011) != 0011  -->> no match!
i:2 -->> ((0011 ^ 1100) | 0001) != 0001  -->> no match!
i:3 -->> ((0011 ^ 1010) | 0000) != 0001  -->> no match!
i:4 -->> ((0011 ^ 1101) | 0010) != 0001  -->> no match!
i:5 -->> ((0011 ^ 0010) | 0000) != 0000  -->> no match!