我认为这个问题可以通过将每个数字分开来解决S到子字符串,使得查询结果必须至少有 1 个分区与查询的相应分区的汉明距离不大于 1。
文章中描述了这个算法:Alex X. Liu,沉克,Eric Torng。大规模汉明距离查询处理,2011 https://ieeexplore.ieee.org/document/5767831。作者将该算法称为HEngine。我尝试解释一些直觉。
Lets N- 数字的位数(它的维数)
k- 查询汉明距离
r-cut(α)- 分号功能α into r子串{α1, α2, ..., αr}第一个在哪里r - (m 模 r)子串有长度⌊m/r⌋和最后一个m mod r子串有长度⌈m/r⌉
该算法基于以下定理:
对于任意两个二进制字符串β and γ这样HD(β,γ)≤k, 考虑r-cut(β) and r-cut(γ) where r ≥ ⌊k/2⌋ + 1。一定是这样的HD(βi,γi)≤1至少q = r − ⌊k/2⌋的不同值i.
例如,我们有长度的二进制字符串N = 8位。我们想找到子串k = 2.
α = 10001110
β = 10100110
HD(α, β) = 2
那么最小值r = ⌊2/2⌋ + 1 = 2。在这种情况下r-cut(α,β)产生 2 个长度为 4 位的子串:
α1 = 1000 α2 = 1110
β1 = 1010 β2 = 0110
HD(α1, β1) = 1, HD(α2, β2) = 1
q = 2 - ⌊2/2⌋ = 1.
作者还介绍了下一个定理:
考虑任何字符串β ∈ T这样HD(α, β) ≤ k。给定任意r ≥ ⌊k/2⌋ + 1,由此可知至少有一个签名β-签名与其兼容的签名相匹配α-签名。
该算法的基本思想是预处理S方便查找所有字符串β in S满足签名匹配属性,然后验证这些字符串中的哪些实际上在汉明距离内k of α.
我想你应该准备一套S使用HEngine算法分表,并拆分Q以同样的方式进行分区。然后按对应分区进行搜索,并考虑到与对应分区的汉明距离不大于1。
我建议您在文章中查看更多详细信息。