假设我有数以百万计的单词的词典(单词列表)。给定一个查询词,我想从最相似的庞大列表中找到该词。

因此,假设我的查询是elepant,那么结果很可能是elephant

如果我的单词是fentist,则结果可能是dentist

当然,假设elephantdentist都出现在我的初始单词列表中。

我可以使用哪种索引,数据结构或算法来快速查询?希望O(log N)的复杂性。

我所拥有的:最天真的事情是创建一个“距离函数”(根据两个词之间的差异来计算两个单词之间的“距离”),然后在O(n)中将查询与列表中的每个单词,然后返回距离最近的单词。但是我不会使用它,因为它很慢。

最佳答案

您所描述的问题是最近邻居搜索(NNS)。解决NNS问题的主要方法有两种:精确近似

如果需要确切的解决方案,我建议使用度量树,例如 M-tree MVP树 BK树。这些树利用三角形不等式来加快搜索速度。

如果您愿意接受一个近似的解决方案,那么可以使用更快的算法。近似方法的当前技术水平为Hierarchical Navigable Small World (hnsw)Non-Metric Space Library (nmslib)提供了hnsw以及其他几种近似NNS方法的有效实现。

(您可以使用Hirschberg's algorithm计算Levenshtein距离)

10-04 20:40