寻找区域内最大重量的点

时间:2015-07-10 08:33:55

标签: algorithm geometry

我的问题是:

我们在2D空间中有一组N点,每个点都有一个权重。给定任何矩形区域R,如何有效地返回R内最大权重的点?

请注意,所有查询区域R都具有相同的形状,即相同的长度和宽度。点和矩形坐标是浮点数。

我最初的想法是使用R - 树来存储点数。对于区域R,提取R中的所有点,然后找到最大点。权重。时间复杂度为O(logN + V),其中VR中的点数。我们可以做得更好吗?

我试图搜索解决方案,但仍未成功。有什么建议吗?

谢谢,

5 个答案:

答案 0 :(得分:0)

这听起来像2D中的范围最大查询问题。你有一些非常好的算法here

更简单的方法是使用2D segment tree

基本上,段树的每个节点都将存储2d区域而不是1d区间。因此每个节点将有4个子节点,缩小为四叉树,然后您可以像经典的分段树一样进行操作。详细描述了here

每个查询O(log n),其中n是总点数。它还允许您进行更多操作,例如更新点的权重,更新区域的权重等。

答案 1 :(得分:0)

如何为每个树节点添加一个附加属性,该节点包含其任何子节点所包含的所有点的最大权重。

添加点时,这很容易更新。删除更改最大值的点时,需要进行一些维护工作。您必须向后遍历树并更新所有父节点的最大值。

使用此属性,如果要检索最大权重点,那么当您使用查询区域查询树时,只会在遍历树时检查具有最大权重的子节点。请注意,您可能有多个具有相同最大权重的点,因此您可能需要检查多个子节点。

仅检查具有最大权重属性的子节点将以提高内存和减少构建/修改树的时间为代价来提高查询吞吐量。

答案 2 :(得分:0)

查找所谓的范围树,在您的情况下,您希望以二维方式实现。这将是一个2层的“树木树”,您首先基于x坐标分割点集,然后在结果树中的一个节点处为每组x点,您构建一个基于树的树在原始树中该节点上的那些点的y坐标上。您可以查找如何调整二维范围树以在O((log n)^ 2)时间内返回查询矩形中的点数,与点数无关。同样,您可以在该矩形内存储点的最大目标值,而不是在范围树中存储子矩阵的点数。这将为您提供O(n log n)时间保证的存储和构造时间,以及O((log n)^ 2)查询时间,无论查询矩形中的点数如何。

对范围树“查找查询矩形中的所有点”的所谓“分数级联”的改编甚至可以将查询时间降低到O(log n),但我不确定,因为你在查询矩形中占据最大值。

答案 3 :(得分:0)

<强>提示:

每个点都有一个&#34;影响区&#34;,这是该矩形(左上角)位置的轨迹,使得该点占主导地位。这组影响区域定义了平面的分区。分区的每个边缘都出现在给定点的横坐标[纵坐标]或其横坐标[纵坐标]减去查询区域的宽度[高度]。

如果将坐标值映射到它们的等级(通过在两个轴上排序),则可以将分区表示为大小为4N²的数字图像。要预先计算此图像,请使用负无穷大进行初始化,并为每个点填充其影响区域的重量,取最大值。如果查询窗口大小平均为像素,则构建图像的成本为NR²

通过查找相关像素的行和列并返回像素值来进行查询。这需要两次二分法搜索,时间Lg(N)

此方法仅适用于N的中等值(例如最多1000)。通过研究分区图的几何结构,可以更好地了解这个问题。

答案 4 :(得分:0)

当从euklidian距离减去正权重时,您可以尝试加权voronoi图。重量较大的站点往往有大型单元格,附近的站点权重较小。然后按站点数量对单元格进行排序,并为每个单元格计算最小边界框。将其与矩形搜索框匹配。