问题描述:
给定平面上平行于坐标轴的线段,每给一个每给一个bounding box(他的边平行于坐标轴),输出哪些线段与该区域相交,称为截窗查询(windowing query)
这些相交的线段可以分成两种类型:
图中的红色类型即为CaseA,即线段的一端或者两端位于该区域内,图中的蓝色部分记为CaseB,即线段纵横整个区域,线段的端点没有位于该区域内部。
对于CaseA的情况,可以采用range query,见Range Query,为了查询CaseB的线段,只需要找到与截窗W的左边和上边相交的所有线段即可:
现在考虑以为的情况:
为了观察,把所有线段拔高了一定的高度。
为了解决一维的问题,引入interval tree数据结构,interval tree数据结构构造如下:
构造interval tree的时间复杂度:
查询过程:
查询时间复杂度:,其中r为报告的CaseB的线段数。
现在回到二维的情况:
构造算法:
查询算法:
总结:
时间复杂度:
空间复杂度:
在保持时间复杂度的同时将空间复杂度降到,首先介绍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)结构,先考虑一维的情况:
但是最坏情况下的空间复杂度仍有
使用BBST:
一维穿刺(stabbing query)查找:
但是最坏情况下的空间复杂度仍需
下面将右边的搜索树改成左边的形式,同样的节点进行合并:
segment tree的构造:
查询算法:
复杂度总结:
下面考虑二维的情况: