【发布时间】:2012-06-03 04:56:05
【问题描述】:
Approximate string matching 不是一个陌生的问题。
我正在学习并试图了解如何解决它。我现在也不想太深入,只想了解蛮力的方式。
在其 wiki 页面 (Approximate string matching) 中,它说
蛮力方法是计算 T 的所有子串到 P(模式)的编辑距离,然后选择具有最小距离的子串。但是这个算法的运行时间是O(m * n^3),n是T的长度,m是P的长度
好的。我对这句话的理解如下:
- 我们找出 T 的所有可能子串
- 我们计算每对字符串 {P, t1}, {P, t2}, ... 的编辑距离
- 我们找出哪个子串与 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',那我还要看另外三对:
{"su", "sv"}{"suv", "sv"}{"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