我的问题是:
我们在2D空间中有一组N
点,每个点都有一个权重。给定任何矩形区域R
,如何有效地返回R
内最大权重的点?
请注意,所有查询区域R
都具有相同的形状,即相同的长度和宽度。点和矩形坐标是浮点数。
我最初的想法是使用R
- 树来存储点数。对于区域R
,提取R
中的所有点,然后找到最大点。权重。时间复杂度为O(logN + V)
,其中V
是R
中的点数。我们可以做得更好吗?
我试图搜索解决方案,但仍未成功。有什么建议吗?
谢谢,
答案 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²
的数字图像。要预先计算此图像,请使用负无穷大进行初始化,并为每个点填充其影响区域的重量,取最大值。如果查询窗口大小平均为R²
像素,则构建图像的成本为NR²
。
通过查找相关像素的行和列并返回像素值来进行查询。这需要两次二分法搜索,时间Lg(N)
。
此方法仅适用于N
的中等值(例如最多1000
)。通过研究分区图的几何结构,可以更好地了解这个问题。
答案 4 :(得分:0)
当从euklidian距离减去正权重时,您可以尝试加权voronoi图。重量较大的站点往往有大型单元格,附近的站点权重较小。然后按站点数量对单元格进行排序,并为每个单元格计算最小边界框。将其与矩形搜索框匹配。