我有以下问题: 给定每个1024位的15位字符串,在同一位置找到不同字符串中的模式的最佳方法是什么?模式的外观对我来说无关紧要(当然长度> 1),我只是想找到至少两个字符串匹配的部分(尽可能长)。 一个例子:
这里我想从前两个字符串(位置2到4,频率2也很好......)获得001,从第二个和第三个字符串(位置1到2)获得00。
我希望,现在问题很明显......有人有想法吗? 谢谢!
答案 0 :(得分:0)
我会尝试用两步法解决你的问题。由于您只有15位串,因此应该足以比较所有位串对(105次比较á16QWORDS应该是可行的)
目前,我还会考虑长度为1的模式,我们将在后面看到如何摆脱这种情况。由于您没有提及编程语言,我将尝试保持它的通用性并使用C语法进行位操作。让a
和b
为两位位串。
i
时,a[i] == b[i]
位才是模式的一部分。我们可以通过计算按位xor(对应于!=
)并否定:patterns = ~(a ^ b)
a
和b
之间的常见模式在pattern
中是连续的1。找到这样长的图案可以例如通过重复移位和AND操作解决,有关详细信息,请参阅this question。如果你期望很长的序列,我会尝试使用一些专用指令来查找非模式位,如果有必要,我会扩展答案。如果这是真正的高吞吐量代码,您可以尝试同时进行多重比较,即使用SIMD指令,但这是另一个问题的主题。