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