几个月前我读到了BK-trees(Burkhard-Keller-Trees),据说这是一个很好的方法来保存你想要通过距离度量。因此,在每种情况下,您希望通过相似性检索某些内容。
然而,这些BK树对我来说似乎不是很快。当我尝试实现并做了一些输出时,只要我允许更长的距离,它就必须在树中四处旅行(我用levenshtein修改它并允许最多6次编辑)。
最快的实现(如果仅关于速度)当然是将从每个条目存储到表中的每个条目并直接查找它们,但这是太多的开销。
因此我在标题中添加了 Realistic 。 可以要求更多的内存,但实现应该仍然是现实的和可用的(我不太了解这些技术,说明现实是什么,但我想有一些边界)。< / p>
是否有比BK树更快的东西,或者BK真的是山顶(还)?
我没有真正的用例,但场景如下:我喜欢1 mio条目的任何东西,它们彼此有一些距离(由距离函数定义)。现在我得到一个条目并想知道:
数据库无关紧要。
我想最终最好的算法会匹配两者?
答案 0 :(得分:1)
另一个基于树的最近邻居指标是http://en.wikipedia.org/wiki/Cover_tree。它声称是实用的,http://www.cs.waikato.ac.nz/ml/weka/已经把它捡起来,所以我的确如此。然而,最近的邻居似乎很难完全用树木或其他任何东西来做,因为有很多建议浮动到近似的最近邻居,我认为如果不是很难,那将是非常愚蠢的。我可以在http://people.csail.mit.edu/indyk/edit.ps看到一个编辑距离。
进行近似最近邻搜索的另一种方法是希望最近邻居具有恰好出现在查询字符串中的连续字符部分。然后对于数据库中的所有字符串,将它们切换到所有连续的k-long子串中,并构建一个可以与精确匹配使用的表。然后,对于您的查询字符串,考虑所有k个连续的子字符串,对这些子字符串进行精确匹配,并计算编辑距离数据库中所有字符串的编辑距离,这些字符串是通过精确搜索k-long子字符串找到的。