用于查找具有相似位值的附近键的数据结构

SPW*_*ley 10 database language-agnostic algorithm math hash

我有一些数据,最多可达一百万到十亿条记录,每条记录由一个位域表示,每个键大约64位.这些位是独立的,您可以将它们想象成基本上随机的位.

如果我有一个测试密钥,并且我想用相同的密钥查找数据中的所有值,则哈希表将很容易地在O(1)中吐出这些值.

什么算法/数据结构可以有效地找到查询键最相似的所有记录?这里类似意味着大多数位是相同的,但允许最小数量是错误的.传统上通过汉明距离来测量 .,它只计算不匹配位的数量.

有两种方法可以进行此查询,一种可能是通过指定不匹配率,例如"给我一个列表,其中包含少于6位且与我的查询不同的所有现有键",或者只是通过最佳匹配,例如"给我一个10,000条密钥的列表,其中我的查询中的不同位数最少."

您可能会想要运行k-最近邻居算法,但在这里我们讨论的是独立位,因此像四叉树这样的结构似乎不太有用.

这个问题可以通过简单的强力测试哈希表来解决少量不同的比特.例如,如果我们想要查找与查询相差一位的所有键,我们可以枚举所有64个可能的键并对它们进行全部测试.但是这很快爆发,如果我们想要允许两位差异,那么我们必须探测64*63 = 4032次.对于更高的位数,它会呈指数级变差.

那么是否有其他数据结构或策略可以使这种查询更有效?可以根据需要对数据库/结构进行预处理,这是应该优化的查询速度.

Nic*_*son 5

你想要的是BK树.它是一个非常适合索引度量空间的树(您的问题是一个),并支持最近邻和距离查询.我刚才写了一篇关于它的文章.

BK-Trees通常是参考文本并使用levenshtein距离来构建树来描述的,但是根据二进制字符串和汉明距离来编写BK树是很简单的.