查找结果接近的哈希

时间:2010-11-11 10:26:05

标签: data-structures hashtable

我有一个表有大约10000个条目,每个条目有近100个布尔值。用户复选了一堆布尔值,并希望获得与其请求匹配的结果。如果该记录不存在,我想向他们展示5条接近的记录(只有1或2个不同的值)。是否有一个好的哈希系统或数据结构可以帮助我找到这些结果。

3 个答案:

答案 0 :(得分:3)

位图索引。谷歌的论文如果你想要完整的背景,这不容易,但值得一读。基本上为你的布尔值构建bitmpas,如下所示:

010110101010
110100010100
000101001100

然后只是通过它们对你的过滤器进行异或,按匹配数量排序,返回。由于所有操作都非常快(每个元素大约一个周期,并且数据结构每个元素使用(编辑)100位内存),即使它是线性的,这通常也会起作用。

附录:如何异或。 (修正了一个错误)

000101001100 source
000101001010 target
000000000110 result of XOR

 int n = 0; if (v) do { n++; } while (v &= (v-1)); return(n);

两个1告诉你有2个错误和m-2个匹配,其中m是位数。

答案 1 :(得分:2)

您描述的是最近邻搜索:根据记录,根据任意距离函数(例如不同值的数量)找到最近的5条记录。

散列函数故意丢弃除“这些值相等”之外的任何信息,因此它不是真正的方法。

考虑使用针对最近邻居搜索而优化的数据结构,例如kd-treevp-tree。如果列表中已经存在记录的概率很高,您可以先使用哈希表查找它,然后如果它不存在则返回kd树。

答案 2 :(得分:1)

这建立在Kdansky的答案之上。

Create a dynamic array of entries.
Create a cache.

for each lookup,
   check the cache.
   return the cache entry if the value exists.
   otherwise for each value in the dynamic array,
       if hamming distance is less than threshold add to the result list
   cache the value against the result
   return the result

找到汉明距离: xor并找到汉明重量http://en.wikipedia.org/wiki/Hamming_weight