Algorithm 针对集合测试最小汉明距离的算法?
我想做一件相对简单的事情:Algorithm 针对集合测试最小汉明距离的算法?,algorithm,set,hamming-distance,Algorithm,Set,Hamming Distance,我想做一件相对简单的事情: 给定查询编号Q、查询距离d和一组数字S,确定S是否包含任何汉明距离小于或等于d的数字 最简单的解决方案是只制作一个列表,并在上面迭代,计算距离。如果计算的距离小于或等于d,则退出返回值TRUE 但考虑到我想做的只是检查存在性,比线性时间解更快的东西应该是可能的 我试过的一件事是M-tree。参考有关stackoverflow的其他一些问题、wikipedia文章()和两个已有的实现,我昨天花了几个小时实现了一个自定义解决方案。这个问题的一个好处是,在两个数字的异或
- 给定查询编号
、查询距离Q
和一组数字d
,确定S
是否包含任何汉明距离小于或等于S
的数字d
TRUE
但考虑到我想做的只是检查存在性,比线性时间解更快的东西应该是可能的
我试过的一件事是M-tree
。参考有关stackoverflow的其他一些问题、wikipedia文章()和两个已有的实现,我昨天花了几个小时实现了一个自定义解决方案。这个问题的一个好处是,在两个数字的异或上计算popcount(使用SSE指令)实际上比存储可以避免计算度量的数字便宜,因此解决方案有几个方面可以简化并优化速度
结果非常令人失望。事实证明,与最小汉明距离相比,我处理的米制半径很小。例如,在12位数字的空间中,最大汉明距离为12。如果我要寻找的最小值是4,那就不会给良好的非重叠分区留下太多机会。事实上,我试过这样做,用蛮力创建一组最小汉明距离为4的12位数字,然后(用蛮力)找到最佳二叉树分区,这样搜索算法可以访问最少数量的节点。如果我想计算查询中d个集合元素的数量,我不能将节点访问次数减少到总访问次数的30%以下,并且在发现第一个节点的访问次数约为4%时停止。这意味着我或多或少地做了一个线性时间解决方案,其中精心设计的树搜索算法的开销与不必检查那么多集合成员所节省的开销大致相同
但我想做的是非常有限的。我甚至不想用查询距离来计算集合成员的数量,我认为可以通过将每个数字从S分割成子字符串来解决这个问题,这样查询结果必须至少有一个汉明距离不大于1的分区,并与查询的相应分区相匹配 本文中描述了此算法:。作者称该算法为HEngine。我试图解释一些直觉 让我们计算N位数字(它的维数) k-查询汉明距离 r-割(α)-将数α分裂成r子串{α1,α2,…,αr}的函数,其中第一个r− (m mod r)子字符串具有长度⌊m/r⌋ 最后的m mod r子串具有长度⌈m/r⌉ 该算法基于以下定理: 对于任意两个二进制字符串β和γ,使得HD(β,γ)≤ K,考虑R割(β)和R割(γ),其中R≥ ⌊k/2⌋ + 1.一定是HD(βi,γi)的情况≤ 1表示至少q=r− ⌊k/2⌋ i的不同值 例如,我们有长度为N=8位的二进制字符串。我们想找到k=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⌋ = 一,
作者还介绍了下一个定理:
考虑任何字符串β∈ T使得HD(α,β)≤ K考虑到≥ ⌊k/2⌋ + 因此,至少有一个签名β-签名与其兼容的签名α-签名相匹配
该算法的基本思想是对S进行预处理,以便于在S中找到满足签名匹配属性的所有字符串β,然后验证这些字符串中哪些实际上在α的汉明距离k内
我想您应该使用HEngine算法将S集合准备成子表,并以相同的方式将Q分割成分区。然后根据相应分区的汉明距离不大于1,按相应分区进行搜索
我建议你在文章中看到更多细节 S是否有任何潜在的有用属性?例如,其成员的某些位是否可能是常量(每个元素中相同)?它是否有BDD或非循环DFA的小表示形式?S中的数字有多大?(最好将它们视为一个位集——那么问题是宇宙中有多少个元素。)1是多少位(一个固定的数字?一个固定的比例?)?d有多大?每个查询的大小是否不同?或者,您是否能够通过预处理快速解决带有固定d的查询?S中有多少个数字(位集?@harold我认为这些数字没有任何规则结构。它们基本上是随机的。我可以就更大的问题提供更多的细节,也许我们可以看看是否有更高级别的组织,但我只是不知道。嗯,有更多的组织也没什么坏处information@j_random_hacker对于给定的问题,S中的数字是固定大小的。我想知道的一件事是,在某些位数(即8位中的20位)中可以容纳多少个最小汉明距离d。对于给定的问题,d也是常数。
α1 = 1000 α2 = 1110
β1 = 1010 β2 = 0110
HD(α1, β1) = 1, HD(α2, β2) = 1