用于查找大于或小于每个笛卡尔维度中的值的所有点的空间数据结构

时间:2014-03-11 23:14:11

标签: algorithm search optimization data-structures spatial

我目前正在研究一个优化问题,该问题需要在所有基本方向上找到大于(或在某些情况下小于)特定点的所有点。例如,在2D中,我可能需要找到满足条件的所有点:

x > x* and y < y* 
for an arbitrary point (x*,y*)

(例如 - 如果下图中的蓝点是(x *,y *),我需要蓝色虚线定义的框中的所有点。)

注意:我需要这是一个N维结构/搜索,因为我的实际优化问题有两个以上的目标,必须解决。典型的搜索空间大约为1000-5000点,并且具有2到5个维度。

是否有适合此目的的特定数据结构?在过去,我使用kd-trees来查找最近的邻居,以及半径内的所有点,但是在这种情况下我需要定向搜索。看起来某种形式的R-Tree可以解决这个问题,我的搜索矩形将分别从x *,y *变为一些主要的正值和负值。是否有更好的数据结构特定于此类搜索?

example plot

1 个答案:

答案 0 :(得分:6)

根据我从您的评论中读到的内容,您将获得一组积分 P 1 ,...,P n 并且你想找到每个点 P i =(x 1 ,...,x d 点数 P j =(y 1 ,...,y d 所有 k 的x k R k y k ,其中 R k 是(&lt; &gt; )之一。

一个观察结果是,您可以按照第一个坐标对点进行排序,并按照它们在该坐标上可见的顺序将它们添加到数据结构中。这会从搜索问题中删除一个维度,因此在d维情况下,您的问题现在会减少到(d-1)维正交范围查询问题。这种优化完全独立于您实际解决正交范围查询的方式,并且本身可能使蛮力实现更加可行。

由于您的点集或多或少是静态的(您可以在整个点集上构建数据结构,最初将所有节点的计数器设置为零,然后通过启用它们“插入”点),您可以使用{ {3}}解决正交范围查询。在简单的实现中,这将为您提供 O(n log d-2 n)预处理和 O(log d-2 n )查询时间,数据结构略有增强版

因此总的来说,一个阶段的成本将是 O(n log d-2 n)。由于你的 n 是如此之小,我不确定这是否真的会给你带来太大的影响(对于5-d情况来说可能不合理,甚至可能不是4-d)。

如果您想要走这条路线,我强烈推荐range tree,它涵盖正交范围查询(在L03和L04中)。他还介绍了您需要的概念上稍微简单的半开放查询,因此也许可以使用较低的常数因子来实现。

原始范围树数据结构很遗憾是完全静态的,但是存在动态变体,因此您甚至可以在具有许多共享点的阶段之间重用树,并且实际上使用具有更好查询时间的变体。您可以搜索“动态正交范围查询”以获取更多信息,有几篇关于该主题的论文。我怀疑这对你的问题规模有意义。

如果您的点分布足够随机,您可以将这些点划分为 O(n 0.5 矩形桶。您可以计算 O(1)中存储桶中的点数以及 O(n 0.5 中存储桶中的点数与范围树相比,实现的开销非常低。结合一个坐标的排序,这应该给你体面的加速。这绝对是我首先尝试的。