【问题标题】:Is it possible to allow mismatches in KMP algorithm?是否可以允许 KMP 算法中的不匹配?
【发布时间】:2013-12-06 09:06:59
【问题描述】:

在将pattern 与文本进行比较时,我正在寻找一种有效的算法来允许不匹配(最多 3 个)。原始 KMP 在我的数据上有效地完成了这项工作,但正在考虑扩展此算法以适应不匹配。

对于我的情况:GACCCT 被认为与 GGGGGAGGTTTTTT 匹配,第二个序列中的起始位置为 4

我需要在两个文件之间进行成对比较。每个包含大约 500,000 个序列。一个文件中的序列相对较短(~50 个碱基),而另一个文件中的序列较长(~200)

我尝试了 Python 中的 Regex 包、Levenshtein 算法和编辑距离。但是它们很慢,我将不得不等待几周才能完成工作。

【问题讨论】:

  • strstr 适用于直接匹配,可能使用 strstr 之类的东西作为模式的前半部分并计算后半部分的不匹配,然后 strstr 查找后半部分并计算上半场的失配会奏效吗?当然,对于三个不匹配,您需要至少 1/4 的字符串来匹配并计算其余的不匹配...在您的示例中,找到模式中的任何一个字母就足够了,因为您最多允许三个不匹配。
  • 去过那里,但速度是威慑。我需要到这几千亿次。这些的运行时间不是很好,因为它需要数周才能完成。这就是为什么我现在正在寻找 KMP 看看是否可以修改。
  • 您的数据有多大(大约)? 1 KB、1 MB、100 MB、1 GB...?
  • @Mehrdad,请参阅 OP。感谢您的评论

标签: c string algorithm string-matching


【解决方案1】:

我认为您的数据不是太大,所以也许这会起作用:
我认为您应该为您的数据创建一个suffix tree。一旦你这样做了,查找子字符串将非常容易,无论你是否想计算不匹配:你只需用你正在寻找的字符遍历树,直到你找到一个子字符串,或者找到最多数量的您可以容忍的不匹配。

【讨论】:

    【解决方案2】:

    如果您希望最多三个不匹配,那么有一种简单但愚蠢的算法适用于大多数实际情况。任意将您的图案分成四个连续的部分。 (对他们来说,以大致相同的概率匹配随机文本位置可能很有用。)在四个连续部分的文本中找到所有匹配项。看看哪一个通过蛮力完成了最多三个不匹配的匹配。

    Mehrdad 使用后缀树的解决方案总体上更好,但它需要更多的编程工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多