【问题标题】:Find nearset neighbours in large set在大集合中找到最近的邻居
【发布时间】:2013-02-15 14:40:17
【问题描述】:

我在多维空间中有大量点。而且我想为任何给定点找到几个邻居(在附近)(要求是避免扫描所有点)。

我想知道我的解决方案是否合适:

预处理:

  1. 定义一组正交轴
  2. 对每个轴上的每个点进行投影
  3. 每个投影都与其到轴起点(键)的距离和点标识符(值)相关联。 索引投影 - 将它们全部放入排序集(例如树集)
dist = distance of projection to the start point of axis
point_num = number of point 
sorted_set.put( dist, point_num )

查找任意给定点的邻居:

  1. 找到它在每个轴上的投影
  2. 使用 idex - 查找每个 exis 上最近的投影
  3. 查找实际邻居 - 所有结果的相交
dx = radius of neighborhood (some constant) 

dist_1 = distance of projection of given point to start point of axis_1 
list_1 = sorted_set_1.get_sub_set( dist_1 - dx, dist_1 + dx )

dist_2 = distance of projection of given point to start point of axis_2
list_2 = sorted_set_2.get_sub_set( dist_2 - dx, dist_2 + dx ) 

return intersection_of( list_1, list_2 )

这是一个简单的例子:

相交[2, 4, 1][4, 5] 产生答案[4]

如果我的算法有任何错误,请指出我

谢谢

【问题讨论】:

  • “2. 对每个轴上的每个点进行投影”如何避免像您需要的那样扫描所有点?
  • 预处理将只进行一次(复杂度为 O(N*lg(N)),在红黑树作为索引的基础结构的情况下) - 所以这对我来说不是问题。但是寻找邻居是非常频繁的操作,所以在为每个给定点寻找邻居时,我不想每次都扫描所有点。
  • 你研究过 K-D 树吗? en.wikipedia.org/wiki/K-d_tree
  • 好的,谢谢。但我想知道,我的解决方案是否合适(因为它与 K-D 树具有相同的复杂性)。有没有我的解决方案无法涵盖的情况?
  • 您的任务通常使用 n 维四叉树(八叉树)来解决。有一整本 1000 页的书:Hannan Sammet:多维搜索结构的基础

标签: algorithm search indexing computational-geometry knn


【解决方案1】:

您尚未向我们提供有关如何构建实际邻居集的说明,在本例中为 [2, 4, 1][4, 5]。为什么从一个索引中选择 3 个元素,从另一个索引中选择 2 个?

你还说你想找几个邻居。几个是多少,或者它应该是你的功能的输入?在示例中您只找到一个,算法是否应该决定您想要多少?

如果所有点都在您的一个轴上的一条线上,会发生什么情况?那么一组肯定包含所有元素。

【讨论】:

  • 我在我的问题中嵌入了一些伪代码。例如,对于索引,可能会使用红黑树 - 它们允许在 O(lg(N)) 时间内找到邻域内的键。
猜你喜欢
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2013-06-08
相关资源
最近更新 更多