Algorithm 在大集合中查找近邻集
我在多维空间中有很多点。我想为任何给定的点找到几个邻居(在邻域内)(要求避免扫描所有点) 我想知道我的解决方案是否合适: 预处理:Algorithm 在大集合中查找近邻集,algorithm,search,indexing,computational-geometry,knn,Algorithm,Search,Indexing,Computational Geometry,Knn,我在多维空间中有很多点。我想为任何给定的点找到几个邻居(在邻域内)(要求避免扫描所有点) 我想知道我的解决方案是否合适: 预处理: 定义一组或正交轴 对每个轴上的每个点进行投影 每个投影都与其到轴(关键点)起点的距离和点(值)的标识符相关联索引投影-将所有投影放入排序集(例如树集) 要查找任意给定点的邻居,请执行以下操作: 找到它在每个轴上的投影 使用IDEX-在每个exis上查找最近的投影 要查找实际邻居-所有结果的交集 下面是一个简单的例子: 将[2,4,1]和[4,5]相交生成答案[4]
[2,4,1]
和[4,5]
相交生成答案[4]
如果我的算法有任何错误,请告诉我
谢谢您尚未向我们提供有关如何构建实际邻居集的说明,在本例中为
[2,4,1]
和[4,5]
。为什么从一个索引中选择3个元素,从另一个索引中选择2个元素
你还说你想找几个邻居。多少是几个,还是应该作为函数的输入?在这个例子中,你只找到一个,算法是否应该决定你想要多少
如果所有点都在一条轴上的一条线上,会发生什么情况?那么一个集合肯定包含所有元素。您还没有向我们说明如何构建实际的邻居集合,在本例中是
[2,4,1]
和[4,5]
。为什么从一个索引中选择3个元素,从另一个索引中选择2个元素
你还说你想找几个邻居。多少是几个,还是应该作为函数的输入?在这个例子中,你只找到一个,算法是否应该决定你想要多少
如果所有点都在一条轴上的一条线上,会发生什么情况?然后一个集合肯定包含所有元素。我在问题中嵌入了一些伪代码。例如,对于索引,可以使用红黑树-它们允许在O(lg(N))时间内找到邻域内的键。例如,对于索引,可以使用红黑树-它们允许在O(lg(N))时间内找到邻域内的关键点。“2.在每个轴上投影每个点”如何避免像您所需要的那样扫描所有点?预处理只需执行一次(复杂性为O(N*lg(N))在红黑树作为索引的底层结构的情况下),所以这对我来说不是问题。但是寻找邻居是非常频繁的操作,所以我不想每次都扫描所有的点,当为每个给定的点寻找邻居时。你看过K-D树吗?是的,谢谢。但我想知道,我的解决方案是否合适(因为它与K-D树具有相同的复杂性)。是否有我的解决方案无法解决的情况?您的任务通常使用n维四叉树(oct树)来解决。有一整本1000页的书:Hannan Sammet:Foundations of Dimensional search structuresHow做了“2.在每个轴上投影每个点”避免像你所需要的那样扫描所有点?预处理只需进行一次(复杂度为O(N*lg(N)),如果红黑树作为索引的底层结构)-所以这对我来说不是问题。但是寻找邻居是非常频繁的操作,所以我不想每次都扫描所有的点,当为每个给定的点寻找邻居时。你看过K-D树吗?是的,谢谢。但我想知道,我的解决方案是否合适(因为它与K-D树具有相同的复杂性)。是否有我的解决方案无法解决的情况?您的任务通常使用n维四叉树(oct树)来解决。有一整本1000页的书:《汉南·萨米特:多维搜索结构的基础》
dist = distance of projection to the start point of axis
point_num = number of point
sorted_set.put( dist, point_num )
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 )