在立方体盒子里,我在R ^ 3中有一个大的收集点。我想为每个点找到k个最近邻居。通常我认为使用类似k-d树的东西,但在这种情况下我有周期性的边界条件。据我了解,k-d树通过将空间切割成一个较小维度的超平面来划分空间,即在3D中我们将通过绘制2D平面来分割空间。对于任何给定的点,它可以在平面上,在它上面,也可以在它下面。但是,当您使用周期性边界条件分割空间时,可以认为某一点位于任何一侧!
在R ^ 3中查找和维护具有周期性边界条件的最近邻居列表的最有效方法是什么?
近似值不够,点数一次只能移动一个(想想蒙特卡罗而不是N体模拟)。
答案 0 :(得分:4)
即使在欧几里德的情况下,一个点及其最近的邻居也可能位于超平面的两侧。 k-d树中最近邻搜索的核心是确定点和盒之间距离的基元;您的案例所需的唯一修改是考虑环绕的可能性。
或者,您可以实现覆盖树,它适用于任何指标。
答案 1 :(得分:2)
(我发布这个答案,即使我不完全确定它是否有效。直观地看来它是正确的,但可能有一个我没有考虑过的边缘情况)
如果您正在处理周期性边界条件,那么您可以将空间视为切割成一系列固定大小的块,然后将它们叠加在一起。假设我们在R 2 。然后一个选项是复制该块九次并将它们排列成块的3x3网格重复。鉴于此,如果我们找到中心广场中任何单个节点的最近邻居,那么
换句话说,我们只需复制元素足够多次,以便点之间的欧几里德距离让我们在模数空间中找到相应的距离。
在n维中,你需要制作所有点的3个 n 副本,这听起来很多,但是对于R 3 只增加了27倍。原始数据大小。这肯定是一个巨大的增长,但如果它在可接受的范围内,你应该能够使用这个技巧来利用标准的kd树(或其他空间树)。
希望这有帮助! (并希望这是正确的!)