计算几何学习——截窗查询

问题描述:

给定平面上平行于坐标轴的线段S=\{s_i = [p_i,p_i'] | 1\leq i\leq n\},每给一个每给一个bounding box(他的边平行于坐标轴),输出哪些线段与该区域相交,称为截窗查询(windowing query)

这些相交的线段可以分成两种类型:

图中的红色类型即为CaseA,即线段的一端或者两端位于该区域内,图中的蓝色部分记为CaseB,即线段纵横整个区域,线段的端点没有位于该区域内部。

对于CaseA的情况,可以采用range query,见Range Query,为了查询CaseB的线段,只需要找到与截窗W的左边和上边相交的所有线段即可:

现在考虑以为的情况:

为了观察,把所有线段拔高了一定的高度。

为了解决一维的问题,引入interval tree数据结构,interval tree数据结构构造如下:

构造interval tree的时间复杂度:O(nlogn)

查询过程:

查询时间复杂度:O(r+logn),其中r为报告的CaseB的线段数。

现在回到二维的情况:

构造算法:

查询算法:

总结:

时间复杂度:

空间复杂度:O(nlogn)


在保持时间复杂度的同时将空间复杂度降到O(n),首先介绍ground range query:

首先考虑一维情况的ground range query:

将数据组织成一个最小堆(minimum heap)

使用最小堆进行ground range query:

复杂度:

现在回到二维的ground range query,这里我们将坐标轴顺时针旋转90度,得到:

采用BBST+Heap组成Priority Search Tree进行搜索。

Priority Search Tree构造算法:

注意四种情况所用的四种颜色。

Priority Search Tree构造举例:

时间复杂度分析(针对四种情况):


以上讨论的是平行于坐标轴的线段的windowig query,下面讨论一般的情况,即线段不一定平行于坐标轴。

也可以看出,与截窗相交的线段也可以分为CaseA和CaseB两种情况,同上,CaseA情形的线段可以使用range query进行查询,下面介绍CaseB情况:

这里我们使用线段树(Segment Tree)结构,先考虑一维的情况:

但是最坏情况下的空间复杂度仍有\Omega (n^2)

使用BBST:

一维穿刺(stabbing query)查找:

但是最坏情况下的空间复杂度仍需\Omega (n^2)

下面将右边的搜索树改成左边的形式,同样的节点进行合并:

segment tree的构造:

查询算法:

复杂度总结:

下面考虑二维的情况:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值