【问题标题】:Concrete algorithm code for approximate string matching近似字符串匹配的具体算法代码
【发布时间】:2012-06-03 04:56:05
【问题描述】:

Approximate string matching 不是一个陌生的问题。

我正在学习并试图了解如何解决它。我现在也不想太深入,只想了解蛮力的方式。

在其 wiki 页面 (Approximate string matching) 中,它说

蛮力方法是计算 T 的所有子串到 P(模式)的编辑距离,然后选择具有最小距离的子串。但是这个算法的运行时间是O(m * n^3),n是T的长度,m是P的长度

好的。我对这句话的理解如下:

  1. 我们找出 T 的所有可能子串
  2. 我们计算每对字符串 {P, t1}, {P, t2}, ... 的编辑距离
  3. 我们找出哪个子串与 P 的距离最短,这个子串就是答案。

我有以下问题:

一个。我可以使用两个 for 循环来获取所有可能的子字符串,这需要 O(n^2)。所以当我尝试计算一个子串和模式的编辑距离时,它是否需要 O(n*m)?为什么?

b.我究竟如何计算一对(一个子串和模式)的距离?我知道我可以插入、删除、替换,但是谁能给我一个只计算一对的算法?

谢谢


编辑

好的,我应该使用Levenshtein distance,但是我不太明白它的方法。

这是部分代码

for j from 1 to n
{
    for i from 1 to m
    {
      if s[i] = t[j] then  
        d[i, j] := d[i-1, j-1]       // no operation required
      else
        d[i, j] := minimum
                   (
                     d[i-1, j] + 1,  // a deletion
                     d[i, j-1] + 1,  // an insertion
                     d[i-1, j-1] + 1 // a substitution
                   )
    }
  }

所以,假设我现在比较{"suv", "svi"}

所以'v' != 'i',那我还要看另外三对:

  1. {"su", "sv"}
  2. {"suv", "sv"}
  3. {"su", "svi"}

我如何理解这部分内容?为什么我需要查看这 3 个部分?

distance between two prefixes 是否意味着我们需要更改distance 的次数才能使两个前缀(或字符串)相等?

那么,让我们来看看{"su", "sv"}。我们可以看到{"su", "sv"}的距离是1,那么{"su", "sv"}怎么能通过加1变成{"suv", "svi"}呢?我认为我们需要在“su”中插入“v”,在“sv”中插入“v”,然后将最后一个“i”替换为“v”,这涉及到 3 个操作,对吧?

【问题讨论】:

  • 最常用的词对距离算法是en.wikipedia.org/wiki/Levenshtein_distance
  • @biziclop:我没有及时看到您的评论 - 将其作为答案发布,我会删除我的。
  • @Aasmund Eldhuset 没关系 :)
  • @biziclop 你能看看我的新编辑部分吗?

标签: string algorithm data-structures string-matching


【解决方案1】:

测量两个字符串之间编辑距离的标准方法称为Levenshtein distance - 维基百科页面包含该算法的伪代码。

至于您的编辑:您需要查看{"su", "sv"},因为将"suv" 更改为"svi" 的最佳方法可能是将最后一个v 替换为i,其成本将随之而来除了将"su" 更改为"sv" 的成本之外。或者,最好的方法是将"suv" 更改为"sv",然后添加i。或者,最好的方法是先从"suv" 中删除v,然后将"su" 更改为"svi"。在这种情况下,第一种方法被证明是最好的(或与其他选项一样好)。编辑距离确实是2,操作是把u改成v,把v改成i

【讨论】:

  • 从该伪代码中您还可以看到为什么它需要n*m 步骤。
  • 感谢您的回答。你能看看我的编辑吗?
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 2017-12-23
  • 2015-11-27
  • 2011-05-11
  • 2011-03-03
  • 1970-01-01
  • 2015-04-14
  • 2013-07-10
相关资源
最近更新 更多