在Java中对Map执行最佳levenshtein匹配的最佳方法

时间:2008-09-25 20:06:00

标签: java algorithm

我有一张Java地图。我想比较源字符串与地图中的所有项目,并根据levenshtein比率算法返回最佳匹配。我想知道对列表中的每个元素执行此检查的最佳方法是什么。

谢谢,马特

4 个答案:

答案 0 :(得分:4)

使用标准Map无法获得比O(n)性能更好的效果 - 只需使用按顺序测试它们的天真方法。

但是,有更有效的方法可以做到这一点。其中一个被称为bk-tree。基本上,您构造一个n路树,边缘由节点之间的levenshtein距离确定。然后,您可以使用triangle inequality来大规模缩减您必须搜索的节点。对于短距离,它非常有效。这是我前段时间写的blog article,详细描述了它。通过一些额外的工作,您可以查询它的最近邻居,而不是反复查询距离1,2等。

答案 1 :(得分:0)

由于levenshtein比率既取决于源也取决于目标,因此每个源字符串的值都会发生变化。除非在后续搜索中很可能重复源字符串,否则只需遍历地图元素。如果速度确实是一个问题,请确保您使用的是最新的Java编译器并使用优化选项。

答案 2 :(得分:0)

当然,如果您还没有这样做,那么请使用现成的优化Levenshtein实现,就像在commons-lang StringUtils中那样。

答案 3 :(得分:0)

如果迭代所有地图元素的成本太高,您可以考虑使用k-gram indexes