我有一个相对简单的事情我想做:
最简单的解决方案是让S成为一个列表并迭代它,计算距离。如果计算的距离小于或等于d,则挽救返回TRUE。
但考虑到我想要做的就是检查是否存在,应该有可能比线性时间解决方案更快。
我尝试的一件事是M树。在stackoverflow上引用了一些其他问题,维基百科文章(https://en.wikipedia.org/wiki/M-tree)和两个预先存在的实现,我昨天花了几个小时实现自定义解决方案。关于这个问题的好处之一是,在两个数字的XOR(使用SSE指令)上计算popcount实际上比存储允许避免计算度量的数字更便宜,所以有几个方面可以简化和优化速度的解决方案。
结果非常令人失望。事实证明,与最小汉明距离相比,处理的度量半径I&m; m。例如,在12位数字的空间中,最大汉明距离是12.如果寻找的最小值I是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)有人想共同撰写论文,请告诉我。 :)
答案 0 :(得分:1)
我认为可以通过将每个数字从 S 拆分为子字符串来解决这个问题,这样查询结果必须至少有一个分区,其汉明距离不超过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。
我建议您在文章中查看更多详细信息。