除了提到最佳第一算法的答案之外,其他答案都偏离了主题。局部敏感哈希基本上是一种幻想。这是我在stackoverflow上看到的答案与问题相差甚远的第一次。
首先,这是一个难题,但已经在多年前通过不同的方式得到了解决。
一种方法使用trie树,例如Sedgewick在此处提出的那样:
http://www.cs.princeton.edu/~rs/strings/
Sedgewick还有样例C代码。
我引用Bentley和Sedgewick在论文"Fast Algorithms for Sorting and Searching Strings"中的话:
“‘‘近邻’’查询
定位给定汉明距离内的所有单词(例如,code距离soda为2)。我们提供了一种新的字符串近邻搜索算法,提供了一个简单的C实现,并描述了其效率的实验。”
第二种方法是使用索引。将字符串拆分为字符n-gram并使用反向索引进行索引(谷歌Lucene拼写检查器以了解如何执行此操作)。使用索引拉取潜在的候选项,然后对候选项运行汉明距离或编辑距离。这是保证最好(相对简单)的方法。
第三种方法出现在语音识别领域。查询是wav信号,数据库是一组字符串。有一个"表"可以将信号的部分与单词的部分匹配。目标是找到与信号最匹配的单词。这个问题称为单词对齐。
在所发布的问题中,匹配查询部分和数据库部分存在隐含成本。例如,可能具有不同的删除/插入/替换成本,甚至可能具有不同的不匹配成本,比如"ph"和"f"不匹配的成本。
语音识别中的标准解决方案使用动态规划方法,通过指导修剪来使其高效。这样,只保留最佳的50个候选项。因此,称为最佳优先搜索。理论上,您可能无法获得最佳匹配,但通常会获得良好的匹配。
这是关于后一种方法的参考资料。
http://amta2010.amtaweb.org/AMTA/papers/2-02-KoehnSenellart.pdf
快速近似字符串匹配算法:基于后缀数组和A*解析。该方法不仅适用于单词,还适用于句子。