这里定义的二进制字符串是固定大小的“数组”位。我称之为字符串,因为它们没有顺序(排序/索引它们,因为数字没有意义),每个位都独立于其他位。每个这样的字符串都是N位长,其中N是数百个。
我需要存储这些字符串并使用汉明距离作为距离度量为最近邻居提供新的二进制字符串查询。
有基于度量的搜索(VP树,覆盖树,M树)的专用数据结构(度量树),但我需要使用常规数据库(在我的情况下是MongoDB)。
是否有一些可以应用于二进制字符串的索引函数可以帮助DB在执行一对一汉明距离匹配之前仅访问记录的子集? 或者,如何在标准DB上实现这种基于汉明的搜索?
答案 0 :(得分:3)
汉明距离是一个度量,因此它满足三角不等式。对于数据库中的每个位串,您可以将它的汉明距离存储到某个预定义的常量位串。然后,您可以使用三角形不等式来过滤掉数据库中的位串。
所以,让我们说
C <- some constant bitstring
S <- bitstring you're trying to find the best match for
B <- a bitstring in the database
distS <- hamming_dist(S,C)
distB <- hamming_dist(B,C)
因此,对于每个B
,您都会存储相应的distB
。
hamming(B,S)
的下限为abs(distB-distS)
。上限为distB+distS
。
您可以丢弃所有B
,使得下限高于最低上限。
我不是100%确定选择C
的最佳方式。我想你会希望它是一个位串,它接近你的位串度量空间的“中心”。
答案 1 :(得分:2)
您可以使用类似于levenshtein automata的方法,应用于位串:
这相当于对数据库进行合并连接以及可能匹配的列表,而不必生成所有可能的匹配。它会减少搜索空间,但仍然可能需要大量查询。