【发布时间】:2013-02-15 14:40:17
【问题描述】:
我在多维空间中有大量点。而且我想为任何给定点找到几个邻居(在附近)(要求是避免扫描所有点)。
我想知道我的解决方案是否合适:
预处理:
- 定义一组正交轴
- 对每个轴上的每个点进行投影
- 每个投影都与其到轴起点(键)的距离和点标识符(值)相关联。 索引投影 - 将它们全部放入排序集(例如树集)
dist = distance of projection to the start point of axis point_num = number of point sorted_set.put( dist, point_num )
查找任意给定点的邻居:
- 找到它在每个轴上的投影
- 使用 idex - 查找每个 exis 上最近的投影
- 查找实际邻居 - 所有结果的相交
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