在多维空间中,我有一组矩形,所有这些矩形都与网格对齐。 (我在松散地使用“矩形”这个词 - 在三维空间中,它们将是矩形棱柱。)
我想查询此集合以查找与输入矩形重叠的所有矩形。
保存矩形集合的最佳数据结构是什么?我将不时地从集合中添加矩形和删除矩形,但这些操作很少发生。我想要快速的操作是查询。
一种解决方案是将矩形的角保留在列表中,并对列表进行线性扫描,找出哪些矩形与查询矩形重叠,并跳过那些没有的矩形。
但是,我希望查询操作比线性更快。
我看过R-tree data structure,但是它包含一系列点,而不是一组矩形,我没有看到任何明显的方法来概括它。
我的矩形坐标是离散的,以防你觉得有用。
我对一般解决方案感兴趣,但我也会告诉你我特定问题的属性:我的问题空间有三个维度,它们的多样性变化很大。第一个维度有两个可能的值,第二个维度有87个值,第三个维度有180万个值。
答案 0 :(得分:3)
您可以根据维基页面使用可用于矩形的KD-Trees:
变体形式
而不是积分
而不是点,kd树也可以 包含矩形或 hyperrectangles [5]。 2D矩形是 被认为是4D物体(xlow,xhigh, ylow,yhigh)。因此范围搜索 成为回归所有人的问题 与搜索相交的矩形 长方形。树是构造的 所有矩形的通常方式 叶子。在正交范围内 搜索,相反的坐标是 用来比较时 中位数。例如,如果是当前的 水平沿xhigh分开,我们检查 搜索的xlow坐标 长方形。如果中位数小于 搜索的xlow坐标 矩形,然后没有矩形 左分支可以与之交叉 搜索矩形等都可以 修剪。否则两个分支都应该 被遍历。另请参阅区间树, 这是一个特殊的案例。
答案 1 :(得分:1)
让我们通过PN调用原始问题 - 其中N是维数。
假设我们知道P1 - 1维问题的解决方案:查找新区间是否与给定的区间集合重叠。
一旦我们知道要解决它,我们就可以检查新矩形是否与每个x / y / z投影中的矩形集合重叠。
因此P3的解决方案相当于P1_x AND P1_y AND P1_z。
为了有效地解决P1,我们可以使用排序列表。列表的每个节点都包括坐标和打开的intetrvals数量 - 这个坐标。
假设我们有以下间隔: [1,5] [2,9] [3,7] [0,2]
然后列表如下:
{0,1},{1,2},{2,2},{3,3},{5,2},{7,1},{9,0}
如果我们收到一个新的区间,比如说[6,7],我们会发现列表中最大的项目小于6:{5,2},而最大项目大于7:{9,0}
因此很容易说新区间与现有区间重叠。
排序列表中的搜索比线性更快:)
答案 2 :(得分:0)
您必须使用某种分区技术。但是,由于您的问题受到限制(仅使用矩形),因此数据结构可以稍微简化一些。我没有详细考虑过这个问题,但这样的事情应该有效;)
使用离散值约束 - 您可以创建一个类似于辅助表的数据结构,您可以在其中存储第二维的离散值(87个可能的值)。假设这些值表示垂直于该维度的平面。对于这些平面中的每一个,您可以在此辅助表中存储与这些平面相交的矩形。
同样对于第三个维度,你可以使用另一个表,你可以使用尽可能多的等间距值(180万是太多,所以你可能想要使这个至少要小几个量级),并创建一个地图两个选定值之间的矩形。
给定一个查询矩形,您可以在常量时间查询第一个表,以确定可能与此查询相交的一组表。然后,您可以在第二个表上执行另一个查询,并执行第一个和第二个查询结果的结果的交集。这应该缩小您必须执行的实际交叉点测试的数量。