我有一个相对简单的事情我想做:
>给定查询号Q,查询距离d和一组数字S,确定S是否包含汉明距离小于或等于d的任何数字.
最简单的解决方案是让S成为一个列表并迭代它,计算距离.如果计算的距离小于或等于d,则挽救返回TRUE.
但考虑到我想要做的就是检查是否存在,比线性时间解决方案更快的事情应该是可行的.
我尝试的一件事是M树.在stackoverflow,维基百科文章(https://en.wikipedia.org/wiki/M-tree)和两个预先存在的实现上引用了一些其他问题,我昨天花了几个小时实现自定义解决方案.关于这个问题的一个好处是,在两个数字的XOR(使用SSE指令)上计算popcount实际上比存储允许避免计算度量的数字更便宜,因此解决方案的几个方面是可以简化和优化速度.
结果非常令人失望.事实证明,与最小汉明距离相比,我正在处理的度量半径很小.例如,在12位数字的空间中,最大汉明距离为12.如果我正在寻找的最小值为4,则不会留下很多机会进行良好的非重叠分区.实际上,我试着通过蛮力创建一组12位数字,最小汉明距离为4,然后(通过强力)找到最佳二叉树分区,以便搜索算法可以访问最少数量的节点.如果我想计算查询的d内的设置元素的数量,我不能将节点访问次数减少到总数的约30%以下,并且当我发现第一次访问约4%时停止.这意味着我或多或少地创建了线性时间解决方案,其中精心设计的树搜索算法的开销与不必检查尽可能多的集合成员的节省大致相同.
但我想做的事情非常有限.我甚至不想计算查询距离< = d的集合成员数,更不用说枚举它们.我只想检查是否存在.这让我想到像布隆过滤器和哈希这样的东西. 我还想过尝试构建一个图形结构,其中集合成员通过带有权重的边连接.使用汉明距离尊重三角不等式的事实,在我看来必须有一些方法来搜索这个图,使得边缘遍历导致可能距离查询的距离较小的方向,但我甚至不知道从哪里开始这里. 有没有人对这里的解决方案有任何其他建议,可以轻松地击败简单迭代数组的性能? 编辑和动机: 最终,这来自编码理论问题.对于给定的偶数d和字大小N,具有最小汉明距离d的代码可以插入到N位数中吗?这允许创建一个代码,该代码可以检测d / 2位错误直到d / 2-1位的错误.我们知道像LDPC这样的香农限制代码,但这适用于具有模糊最小汉明距离的长代码,并且它们需要永久解码.还有像OLSC这样的多位错误代码可以快速解码,但它们远非节省空间.另一方面,对于d = 4,扩展汉明(SECDED)码最佳地紧凑.我已经看到了基于BCH的方法来制作DECTED代码,但我不知道它们是否是最优的.为了探索最佳编码,我想要做的是生成具有一些任意d的N位代码的替代集合并生成用于编码和解码它们的电路,选择最紧凑的.我也希望找到一些我们可能用于更长代码的模式. 如果这是(a)尚未完成,(b)可行,(c)有人想共同撰写论文,请告诉我. 🙂
最佳答案 我认为这个问题可以通过将每个数字从S分割到子字符串来解决,这样查询结果必须至少有1个分区,其汉明距离不超过1与查询的相应分区.
该算法在文章中描述:Alex X. Liu, Ke Shen, Eric Torng. Large scale Hamming distance query processing, 2011.作者将算法称为HEngine.我试着解释一些直觉.
让N位计数(维数)
k – 查询汉明距离
r-cut(α) – 将数字α分解为r子串{α1,α2,…,αr}的函数,其中第一个r – (m mod r)子串长度为⌊m/r⌋,最后一个m mod r子串长度⌈m/r⌉
该算法基于该定理:
对于任何两个二进制串β和γ,使得HD(β,γ)≤k,考虑r-cut(β)和r-cut(γ)其中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以便于在S中找到满足签名匹配属性的所有字符串β,然后验证这些字符串中的哪些实际上在α的汉明距离k内.
我想你应该使用HEngine算法准备S到子表的集合,并以相同的方式将Q分割为分区.然后考虑到汉明距离与相应分区不超过1,通过相应的分区执行搜索.
我建议你在文章中看到更多细节.