用于有效地从集合中检索最近元素的数据结构

时间:2012-02-27 10:05:35

标签: algorithm language-agnostic data-structures

tl; dr 如何有效地实施Mathematica Nearest之类的内容?

Mathematica有一个名为Nearest的函数,它将获取“事物”列表(它们可以是数字,n中的坐标 - 维度空间,字符串等),以及将返回NearestFunction个对象。此对象是一个函数,当应用于x时,将返回与x最接近某个距离度量的列表元素。距离度量可以作为参数传递给Nearest:默认情况下,它使用欧几里德距离表示数字数据,并使用某种编辑距离作为字符串。


示例(这有望使问题更加明确):

nf = Nearest[{92, 64, 26, 89, 39, 19, 66, 58, 65, 39}];

nf[50]将返回距58最近的元素50nf[50, 2]将返回{58, 39},这两个最接近的元素。


问题:实现此功能的有效方法是什么? NearestFunction可能在内部使用哪种数据结构?为不同类型的数据计算最近元素的最佳复杂性是什么?

对于一个简单的数字列表,对它们进行排序并进行二分查找是可行的,但Nearest适用于多维数据以及任意距离函数,所以我认为它使用了更通用的东西。但如果事实证明它专门用于某些类型的数据/距离函数,我不会感到惊讶。

2 个答案:

答案 0 :(得分:9)

对于表现良好的距离函数,有许多专门为此优化的数据结构。对于多维数据,k-d tree(以及其他binary space partitioning trees)可以提供出色的nearest-neighbor searches,通常在次线性时间内。您可能还需要查看metric trees,这些树结构经过优化,可以支持最近邻搜索的方式在某个度量空间中存储点。根据特定的度量空间(欧几里德距离,编辑距离等),不同的数据结构可能或多或少是合适的。

对于对行为没有限制的任意距离函数(例如,甚至不包括三角不等式),那么你可以做的最好的是线性搜索,因为所有点的距离函数可能是无限的除了集合中的一个特定点。

希望这有帮助!

答案 1 :(得分:1)

完全取决于数据和指标。在此处阅读所有相关内容:Nearest Neighbour Search