2017-07-06 51 views
2

我有以下问题: 给定每个1024位的15位字符串,在同一位置上的不同字符串中查找模式的最佳方法是什么?模式的样子对我来说并不重要(当然长度大于1),我只想找到至少有两个字符串匹配的部分(尽可能长)。 一个例子:各种位串的模式搜索

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

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

我希望,问题现在已经清楚了......任何人都有想法? 谢谢!

+2

嗨,欢迎来到Stack Overflow,请花点时间通过[欢迎导览](https://stackoverflow.com/tour)了解你在这里的方式(也可以获得你的第一张徽章),阅读如何创建[Minimal,Complete和Verifiable示例](https://stackoverflow.com/help/mcve)并检查[如何提出好问题](https://stackoverflow.com/help/how-to - 问),所以你增加了获得反馈和有用答案的机会。 – DarkCygnus

+0

如果将它们视为字符串并尝试查找常见的最长子字符串,会出现什么情况?那里有很多算法。如果长度不是很长,你也可以用蛮力来做 – FortyTwo

+0

但是我想找到两个字符串中相同位置的所有常见子字符串。没有得到你的方法如何适合这个问题... – gabse15

回答

0

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

现在,我还会考虑长度为1的模式有效,我们将看到如何稍后摆脱这一点。既然你没有提到编程语言,我会尽量保持它的通用性,并使用C语法来进行位操作。假设ab是两个比特串。

  1. 识别可能的模式:i个比特是当且仅当a[i] == b[i]的图案的一部分。我们可以通过计算按位异或(其对应于!=)和否定有效地标记这些位:patterns = ~(a^b)
  2. 确定最长图案:变换上述已计算后,ab之间的共同模式是在pattern连续的1。寻找如此长的图案可以例如通过重复的移位和AND操作来解决,详见this question。如果你期望真的很长的序列,我会尝试使用一些专用指令来查找非模式位,如有必要,我会扩展答案。

如果这是真正的高吞吐量代码,您可以尝试同时进行多个比较,即使用SIMD指令,但这是另一个问题的主题。