【问题标题】:Pattern search over various bitstrings对各种位串进行模式搜索
【发布时间】:2017-07-06 18:20:32
【问题描述】:

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

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

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

我希望,问题现在很清楚了......有人有想法吗? 谢谢!

【问题讨论】:

  • 您好,欢迎来到 Stack Overflow,请花点时间通过 welcome tour 了解您在此处的方式(并获得您的第一个徽章),阅读如何创建 Minimal, Complete, and Verifiable example并检查How to Ask Good Questions,这样您就有机会获得反馈和有用的答案。
  • 如果你把它们当作字符串,并试图找到共同的最长子串怎么办?那里有很多算法。如果长度不是太长,你也可以用蛮力来做
  • 但我想找到两个字符串中相同位置的所有常见子字符串。不明白你的方法如何适合这个问题......
  • 请再澄清一点。让我们在您的示例中再添加两个字符串: 10011, 10000 。然后对于位置 2 的模式 001,您希望它转储 {10010, 00011, 10011} 但它转储较小的子集,例如 {10010, 00011} 或 {00011, 10011} ?或者你也想要后者?您是否还希望它输出与位置 2 处的 00 匹配的 { 00011, 10000 },或者这不是因为模式长度小于位置 2 处的 001 模式而引起的?还是因为这里只有两个匹配的字符串而另一个有 3 个而不感兴趣?
  • 您所说的“最佳”是什么意思?最快的?您是否只需要一种与编程语言无关的算法,还是您心中有一种特定的语言?我可以为这个问题想出几个解决方案,但你需要缩小你的问题的范围。输入是否具有特殊属性,还是完全随机的?

标签: string algorithm pattern-matching


【解决方案1】:

我会尝试分两步解决您的问题。由于您只有 15 个位串,因此比较所有位串对就足够了(105 个比较 á 16 个 QWORDS 应该是可行的)

现在,我还将考虑长度为 1 的模式有效,稍后我们将看到如何摆脱它。由于您没有提到编程语言,我将尽量保持通用性并使用 C 语法进行位操作。让ab 成为两个位串。

  1. 识别可能的模式:ith 位是模式的一部分当且仅当a[i] == b[i]。我们可以通过计算按位异或(对应于!=)并取反来有效地标记这些位:patterns = ~(a ^ b)
  2. 识别最长模式: 计算完上述转换后,ab 之间的常见模式是 pattern 中的连续 1。找到如此长的模式可以例如可以通过反复移位和AND运算来解决,详见this question。如果您期望非常长的序列,我会尝试使用一些专用指令来查找非模式位,如有必要,我会扩展答案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2021-08-09
    • 2011-10-06
    相关资源
    最近更新 更多