Data structures 查找相近结果的哈希

Data structures 查找相近结果的哈希,data-structures,hashtable,Data Structures,Hashtable,我有一个表,大约有10000个条目,每个条目几乎有100个布尔值。用户选中一组布尔值,希望得到和他们的请求相匹配的结果。如果该记录不存在,我想向它们显示5条接近的记录(只有1或2个不同的值)。是否有一个好的散列系统或数据结构可以帮助我找到这些结果 您描述的是最近邻搜索:根据一条记录,根据任意距离函数(例如不同值的数量)查找5条最近的记录 散列函数故意丢弃除“这些值相等”之外的任何信息,因此这不是真正的方法 考虑使用为最近邻搜索而优化的数据结构,例如or。如果列表中很可能已经存在记录,您可以首先使

我有一个表,大约有10000个条目,每个条目几乎有100个布尔值。用户选中一组布尔值,希望得到和他们的请求相匹配的结果。如果该记录不存在,我想向它们显示5条接近的记录(只有1或2个不同的值)。是否有一个好的散列系统或数据结构可以帮助我找到这些结果

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

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


考虑使用为最近邻搜索而优化的数据结构,例如or。如果列表中很可能已经存在记录,您可以首先使用哈希表查找它,如果kd树不存在,则返回kd树。

位图索引。如果你想要完整的背景资料,那就用谷歌搜索这篇论文吧,这并不容易,但值得一读。基本上为布尔值构建BitMPA,如下所示:

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

附录:如何使用XOR。(修复了一个bug)


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

这是基于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并找到汉明权重

不是每个元素一个周期,它是一个xor,然后计算1。虽然只有10000个条目,但这仍然是一个好主意。流水线为您做到了这一点,您可以从理论上优化汇编代码,直到达到这一点。我知道我在大学的某个时候做过这样的练习。如果它需要2-3个周期:1GHz的CPU每秒提供10亿个周期它也不是每个元素4个字节。它是12个或更多。流水线并不意味着你要做的指令更少。这意味着你所做的指示花费的时间更少。这些指令包括:向计数器中添加一个常量、执行查找(由于地址空间转换,这是多条指令)、多次异或、计数一条(即使使用查找表,这也是多条指令)、执行比较,然后添加到列表或移动到下一条。这仍然是一个好主意,只是不像你想象的那么少的说明。只在安腾上。指令将连续执行,但下一条指令的准备工作将在当前指令完成之前开始。任何指令都不会少于一个周期。
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