有效地找到最匹配的现有字符串到简单的通配符字符串

时间:2015-02-03 21:41:55

标签: regex string algorithm levenshtein-distance

我有一个字符串表是标识符,但每个标识符可以是固定的,也可以是带有一些静态部分的变量标识符。例如,标识符可以是ABC12345,或标识符可以是DEF**45,其中*表示任何字母数字字符。此表中有数十万个标识符,我想根据用户输入的内容将输入的字符串与最接近的字符串进行匹配。如果用户输入ABC12345 - 我们都设置在那里,因为它是直接匹配。如果用户输入DEF1245,则需要进行一些计算。我认为Levenshtein距离在这里是一个很好的候选者,因为这将告诉我(在这种情况下)需要更改两个字母以复制最接近的字符串。如果有一个标识符DEF12**,这不会是一个问题,因为两者距离相同但是没关系,因为至少我知道这两个选项都是有效匹配。问题是我可以在数据库中可能有数千个字符串运行这种比较,这可能会产生很大的效率问题。对我有利的一些事情是长度是一个直接的鉴别器,多个相同的距离不是问题。有没有更有效的方法来处理这些字符串或者更好的方式来存储它们进行处理?它似乎几乎像一个反向正则表达式,但我不太明白如何使用它们而不将每个标识符转换为正则表达式,测试,然后继续。距离计算似乎效率低得多。

1 个答案:

答案 0 :(得分:0)

Levenshtein距离是根据两个句子的字母计算的。 AFAIK没有预先计算步骤可以加速Levenshtein距离。 由于您具有固定长度,因此可以存储id的所有子集,并检查用户针对所有预先计算的子集键入的所有子集

  • 用户类型2345,包含子集2,23,234,234,3,34,345等...
  • 查找与用户输入内容具有相同子集的所有ID,从较长的子集开始:将匹配23456,12345
  • 按最长公共排名排序

首先,我不知道会有多高效。第二个(也是最重要的)是我认为你应该检查Levenshtein距离是否确实存在问题。根据我的经验,成千上万的距离计算不足以显着减慢搜索速度(除非你的id长得多)。先尝试一下,然后再进行优化