【问题标题】:Data structure for efficiently retrieving the nearest element from a set用于有效地从集合中检索最近元素的数据结构
【发布时间】:2012-03-16 19:35:49
【问题描述】:

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 可以处理多维数据以及任意距离函数,所以我想它使用了更通用的东西。但如果它被证明是专门用于某些类型的数据/距离函数,我不会感到惊讶。

【问题讨论】:

标签: algorithm language-agnostic data-structures


【解决方案1】:

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

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

希望这会有所帮助!

【讨论】:

  • 优秀的总结!您提供了要搜索的关键字(重要)和一些链接。
【解决方案2】:

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

【讨论】:

  • 您是否注意到您的图标具有万字符的形式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多