【发布时间】:2012-10-23 09:25:42
【问题描述】:
我有一个问题,我想将数据库中与给定字符串具有一定编辑距离的所有字符串匹配。
我的想法是生成一个正则表达式,它将编辑距离 d 到字符串 s 的所有字符串匹配。
例如,我想为d = 1 和s = 'abc' 生成一个正则表达式r,格式为:r = 'abc|.abc|.bc|a.c|ab.|abc.' 等等。但我不确定这是否非常有效,或者是否已经有一些很好的算法来解决这个问题?我想考虑在编辑距离中甚至字符交换。所以'acb' 也应该是r 的一部分。我想用PHP实现,然后进行SQL查询:SELECT * FROM table WHERE name RLIKE TheRegularExpression.
这是一个很好的方法吗?或者你会推荐什么?
【问题讨论】:
-
如果您想要提高效率,首先您应该避免将无法使用索引解决的 WHERE 条件应用于表中的所有记录,除非该表相当小。
-
另外,考虑到结果模式的长度将是
O(nCd),其中n是字符串的长度,d是您的距离。这可能会导致非常大的模式。例如,对于80字符串,所需距离为5,您将向数据库发送大约2 GB 的RE。 (这仅考虑字符替换,而不是换位。)但是,如果您确定字符串会很短和/或d非常小或非常接近n,这可能是可行的。 -
这里的另一个含义是,如果字符串是用户输入的,你需要确定长度是否在一定的范围内,否则你会创建一个DoS漏洞。 (与使用用户输入参数的任何非常非常低效的算法一样。)
标签: php mysql regex edit-distance