【问题标题】:Maximal exact match with allowing a certain number of mismaches允许一定数量的错配的最大精确匹配
【发布时间】:2016-02-23 14:09:26
【问题描述】:

我正在为这个问题寻找一种有效的算法。

1.给定两个字符串(m,n),第一个的长度相对第二个要小很多(第一个通常用作长度为100的查询,第二个可以是100,000,000个字符。

2.第二个字符串中第一个字符串的所有最大精确匹配也作为两个字符串中的间隔向量给出。在 n 中多次出现 m 的子字符串的机会随着该子字符串的大小的减小而增加。

问题是在 m 和 n 中找到最大的公共区间,从而允许一定数量的不匹配,例如 p。

图中示例

【问题讨论】:

  • 你需要发布示例测试
  • “最大公共区间”是什么意思?什么算作不匹配?
  • @mamdouhalramadan 现在提供示例
  • @SanjayManohar 最大的共同区间是存在于两个字符串中的区间,因此它的共同和不匹配意味着如果您在一个字符串中有 A,那么在第二个字符串中将是 B。 ,请看示例
  • 好的,谢谢,我想我明白了。我尝试了以下我认为最有效的解决方案。

标签: string algorithm substring intervals


【解决方案1】:

有趣的问题。 我想遗传学文献中已经有解决方案,但我不知道。所以这里是一个尝试:

我们当然需要将 B 滑到 A 上,所以让我们开始吧

// let's keep track of best match so far
longestRegionLen   = -1 
longestRegionPos   = -1 // position within A of best match start

for i = 0 to len(A):


end

现在,我们需要将整个 B 与 A 的相应区域进行比较。但如果允许 M 个不匹配,我们只需要知道最后 M+1 个不匹配位置,就可以知道我们的分段有多长“几乎匹配”是。所以,在这个循环中:

  // keep track of last M+1 nonmatches
  lastNonMatch       = int[M+1]   // initialise values to 0
  for j = 0 to len(B):
     match =   A[i+j] == B[j]
     if not match:
        lastNonMatch[0 to M-1] = lastNonMatch[1 to M]
        lastNonMatch[M] = j
        // how long since the nonmatch M nonmatches ago?
        // are we better than the previous one?
        if j-lastNonMatch[0] > longestRegion:
           longestRegionLen = j-lastNonMatch[0]
           longestRegionPos = i+j
  end

我还没有测试过算法,但看起来它会是 O(N*M)。所以发生了什么是

ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDA
       DACCDABBDABDDACCDABDDAB
         *    *   *  *    *
       01234567890123456789012
       i       
                     j
                     ^
                     |

这里不匹配。如果M==3,那么 lastNonMatch 缓冲区包含 [ 0 2 7 11 ]

此时j==14,我们使lastNonMatch[2 7 11 14],我们发现j2的距离很大(12),所以我们称之为最大区域包含 3 个不匹配项。

我想不出办法让这个过程更快,但也许更聪明的人会很快访问您的问题?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 2021-11-14
    相关资源
    最近更新 更多