在数百万个字符串中找到最相似的字符串

时间:2018-12-27 19:40:14

标签: string algorithm search data-structures

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

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

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

当然,我的初始单词列表中同时包含elephantdentist

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

前段时间我做了类似的算法

想法是具有字符的数组char [255] 和值是包含此字符的单词哈希(单词ID)的列表

搜索“ dele ....”时 搜索(d)将返回空列表 search(e)将找到所有带有字符e的东西,包括大象(两次,因为它有两个'e') search(l)将为您带来新的列表,您需要将此列表与上一步的结果结合起来

... 输入结束时,您将有一个列表 那么您可以尝试按wordHash分组,按desc按计数排序

有趣的是,如果您输入的内容缺少一个或多个字符,您只会在搜索过程中收到一个空白列表,并且不会影响这个想法

我最初的算法没有排序,我为每个字符存储了wordId和lineNumber和char位置。 我的主要问题是我想搜索 与ee一起找到“大象” 带着大象找到“大象” 与antph一起找到“大象” 每个单词实际上都是文件中的一行,因此通常很长 文件和行数很大 我想快速搜索包含超过1GB文本文件的目录 因此,即使将它们存储在内存中也是一个问题,为此,您需要3个部分 功能来填充您的缓存 从输入中按字符查找功能 过滤和排序结果的功能(我不使用排序,因为我试图以与读取文件相同的顺序填充缓存,并且我想将包含输入的行以相同的顺序放在上面)

我希望这是有道理的