高效的地图数据结构,支持近似查找


25

我正在寻找一种数据结构,该结构支持有效的键近似查找(例如,字符串的Levenshtein距离),并为输入键返回最接近的匹配项。到目前为止,我找到的最合适的数据结构是Burkhard-Keller树,但是我想知道是否还有其他/更好的数据结构用于此目的。

编辑:我的具体情况的更多详细信息:

  • 字符串之间的Levenshtein差异通常很大。
  • 字符串的最大长度约为20到30个字符,平均长度接近10到12个字符。
  • 我对有效查找比对插入更感兴趣,因为我将构建一组要有效查询的大部分静态数据。

输入字符串上是否有条件以及地图中项目数的大小?插入地图的效率有多高?
edA-qa mort-ora-y 2012年

先生,据我所知,BK树仍然看整个树的很大一部分。但是,我猜这可能是过早的优化吗?
merijn 2012年


Answers:


18

您正在寻找的是Levenshtein /编辑距离中的“近似邻居搜索”(ANNS)。从理论上讲,到目前为止,对于近邻搜索afaik来说,编辑距离相对困难。尽管如此,仍然有很多结果,请参见Ostrovsky和Rabani的这篇论文中的参考文献。如果您愿意考虑使用更简单和更好的解决方案的替代距离度量标准,请继续下一段。对于编辑距离人工神经网络,有因结果因迪克,谁展示了如何构建大小的数据结构在时间Od回答任何查询,并报告一个字符串,该字符串最多比最接近查询字符串的字符串大三倍(这一般化为大小nOdϵ和近似值31/ϵ)。这里n是字符串的数量,ñØdØdñØdϵ31个/ϵñ是任何字符串的最大长度。所述夫斯基和Rabani纸我上面链接改善此结果通过映射字符串矢量使得1d1个向量之间的-distance(一种自然的几何距离,类似于欧式距离)近似于相应字符串之间的编辑距离(这称为“低失真嵌入”)。一旦做到这一点,一种用于人工神经网络的数据结构可以被使用,并且这些变成是更有效的(见下段)。1个

如果您愿意考虑其他距离,那么本地敏感哈希(LSH)可以做得很好。局部敏感哈希是Indyk和Motwani提出的解决ANNS问题的技术,其中将生活在高维空间中的点(读取长向量,长字符串等)哈希到少量存储桶中,以便彼此靠近的点以较高的概率映射到同一单元,而彼此远离的点也以较高的概率映射到不同的单元。CACM中有 Indyk和Andoni撰写的一篇很棒且很容易获得的调查文章。该技术简单快捷,占用空间小。也有代码(我认为文章链接到代码)。它适用于汉明距离(在某些情况下)距离)和欧几里得距离,余弦距离。同样,Muthu和Sahinalp设计了LSH方案,以非常自然地概括编辑距离,即块编辑距离(其中一些编辑操作可以对符号块进行操作)。1个

这种问题非常适合cstheory.SE。那里有一个相关的问题,但似乎要求确切的近邻。


12

您感兴趣的数据结构是度量树。也就是说,它们支持在度量空间中进行有效搜索。度量空间由一组对象和其中定义的满足三角不等式的距离函数组成。然后,给定一组对象和一个查询元素,目标是检索距离查询足够近的那些对象。

由于搜索的问题几乎无处不在计算机科学中,有一个巨大的不同指标的树木量。但是,它们至少可以分为两组:基于数据透视的和基于群集的(当然也有混合动力)。E. Chavez等人(2001年在度量空间中进行搜索)是一项很好的调查。例如,请参见第5章:度量空间的当前解,第283页。

Øñα0<α<1个Øñ2Ø1个

Chavez等。还可以很好地概述其他树木,当然,如果有任何特别提及的地方,您会引以为豪。在实践中,经常通过实验评估不同树木的性能。我认为这在很大程度上取决于空间的结构。因此,很难说哪种树在您的情况下最有效。不过,我认为最好先选择一个最简单的方法。如果BK树最容易构建,请首先尝试。如果他们不满足您的要求,请花时间(也许是编程时间)收集有关您空间的更多事实,以帮助您做出更明智的决定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.