模式搜索各种位串

时间:2017-07-06 18:20:32

标签: string algorithm pattern-matching

我有以下问题: 给定每个1024位的15位字符串,在同一位置找到不同字符串中的模式的最佳方法是什么?模式的外观对我来说无关紧要(当然长度> 1),我只是想找到至少两个字符串匹配的部分(尽可能长)。 一个例子:

  • 10010 ...
  • 00011 ...
  • 00101 ...

这里我想从前两个字符串(位置2到4,频率2也很好......)获得001,从第二个和第三个字符串(位置1到2)获得00。

我希望,现在问题很明显......有人有想法吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

我会尝试用两步法解决你的问题。由于您只有15位串,因此应该足以比较所有位串对(105次比较á16QWORDS应该是可行的)

目前,我还会考虑长度为1的模式,我们将在后面看到如何摆脱这种情况。由于您没有提及编程语言,我将尝试保持它的通用性并使用C语法进行位操作。让ab为两位位串。

  1. 确定可能的模式:当且仅当i时,a[i] == b[i]位才是模式的一部分。我们可以通过计算按位xor(对应于!=)并否定:patterns = ~(a ^ b)
  2. 来有效地标记这些位
  3. 确定最长模式:计算完上述转换后,ab之间的常见模式在pattern中是连续的1。找到这样长的图案可以例如通过重复移位和AND操作解决,有关详细信息,请参阅this question。如果你期望很长的序列,我会尝试使用一些专用指令来查找非模式位,如果有必要,我会扩展答案。
  4. 如果这是真正的高吞吐量代码,您可以尝试同时进行多重比较,即使用SIMD指令,但这是另一个问题的主题。