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
最近的元素50
。 nf[50, 2]
将返回{58, 39}
,这两个最接近的元素。
问题:实现此功能的有效方法是什么? NearestFunction
可能在内部使用哪种数据结构?为不同类型的数据计算最近元素的最佳复杂性是什么?
对于一个简单的数字列表,对它们进行排序并进行二分查找是可行的,但Nearest
适用于多维数据以及任意距离函数,所以我认为它使用了更通用的东西。但如果事实证明它专门用于某些类型的数据/距离函数,我不会感到惊讶。
答案 0 :(得分:9)
对于表现良好的距离函数,有许多专门为此优化的数据结构。对于多维数据,k-d tree(以及其他binary space partitioning trees)可以提供出色的nearest-neighbor searches,通常在次线性时间内。您可能还需要查看metric trees,这些树结构经过优化,可以支持最近邻搜索的方式在某个度量空间中存储点。根据特定的度量空间(欧几里德距离,编辑距离等),不同的数据结构可能或多或少是合适的。
对于对行为没有限制的任意距离函数(例如,甚至不包括三角不等式),那么你可以做的最好的是线性搜索,因为所有点的距离函数可能是无限的除了集合中的一个特定点。
希望这有帮助!
答案 1 :(得分:1)
完全取决于数据和指标。在此处阅读所有相关内容:Nearest Neighbour Search