例如,从英语单词集开始,是否有一个结构/算法允许快速检索字符串,如“light”和“tight”,使用“right”作为查询?即,我想检索与查询字符串的Levenshtein距离较小的字符串。
答案 0 :(得分:4)
此处BK-tree数据结构可能合适。它旨在有效地支持“查询单词中编辑距离k以内的所有单词是什么?”形式的查询?它的性能保证相当不错,并且实施起来并不太难。
希望这有帮助!
答案 1 :(得分:1)
由于对于长度为n和m的字符串计算Levenshtein距离为O(nm)
,计算所有Levenshtein距离L(querystring, otherstring)
的天真方法非常昂贵。
但是,如果您可视化Levenshtein算法,它基本上会填充具有编辑距离的n * m表。但对于以相同的几个字母(前缀)开头的单词,Levenshtein表的前几行将是相同的。 (当然,修复查询字符串。)
这表明使用trie (also called prefix tree):阅读查询字符串,然后构建一系列Levenshtein行。之后,您可以轻松遍历它以查找接近查询字符串的字符串。
( 意味着你必须为新的查询字符串构建一个新的trie。我不认为所有对有一个类似的有趣结构的距离。)
我以为我最近看到一篇关于这个的文章有一个很好的python实现。如果我能找到它,将添加一个链接。 修改: Here it is, on Steve Hanov's blog.
答案 2 :(得分:0)
我认为最快的方法是预先建立一个可以在O(1)时间内索引和访问的相似性缓存。诀窍是找到常见的拼写错误添加到缓存中,这可能会变得非常大。
我想谷歌会使用各种统计查询搜索数据做类似的事情。