CG-windowing query

More Geometric Data Structures-windowing query

(更多几何数据结构:截窗)

CG系列文章


CG-Introduction
CG-Voronoi Diagrams
CG-Line Segment Intersection
CG-Polygon Triangulation
CG-Delaunay Triangulations
CG-Orthogonal Range Searching
CG-windowing query



在这里插入图片描述
给定一个矩形区域⎯⎯称为截窗(window)⎯⎯系统必须能够确定,地图中的那些部分(公路、 城市等)落在截窗内部,并显示这些内容。这个过程,称为截窗查询(windowing query)。

窗口查询类似于第5章中研究的范围查询
二者的区别:

  • 1)范围查询的数据是点,而窗口查询的数据通常是线段,多边形,曲线等。
  • 2)对于范围查询,我们经常处理更高维度的搜索空间,而对于窗口查询,搜索空间通常是2维或3维。

10.1 Interval Trees(区间树)

printed circuit board (印刷电路板)是一个典型的例子
在这里插入图片描述

假设:
查询窗口是轴平行的矩形,即边缘是轴平行的矩形。

设S为一组共n条与坐标轴平行的线段。为了解答截窗查询,需要使用一种数据结构来存放S, 使得对于任何给定的查询窗口W := [x : x’] × [y : y’],与W相交的所有线段总可以有效地被报告出来。

分为以下情况:

  • 线段可能完全落在W内部,
  • 可能与 W的边界有一个交点,
  • 也可能有两个交点,
  • 也可能与W的边界(部分)叠合(即有无数个交点)

Lemma 10.1

Let S be a set of n axis-parallel line segments in the plane. The segments that have at least one endpoint inside an axis-parallel query window W can be reported in O(log n + k) time with a data structure that uses O(n log n) storage and preprocessing time, where k is the number of reported segments.

设 S 为平面上一组共 n 条与坐标轴平行的线段。对于任一与坐标轴平行的查询窗口,我们都可在 O(logn + k)时间内,将至少有一个端点落在该查询窗口内的所有线段报告出来;为此,需要使用一个 占用 O(nlogn)空间的数据结构,其预处理时间为 O(nlogn)。其中,k 为实际被报告出来的线段条数。

仍然需要查找在查询窗口内没有端点的段。 这些段要么跨越W的边界两次,要么包含边界的一个边缘。(图下图)
在这里插入图片描述
与查询窗口相交、两个端点都落在查询窗口之外的线段

问题:
预处理平面中的一组水平线段,以便可以有效地报告与垂直查询段相交的段。

Let :l= (x = qx) denote the query line. A horizontal segment s := (x,y)(x’,y) is intersected by l if and only if x <= qx <= x’.
l是查询线 s是水平线段,x是左端点横坐标,x’是右端点横坐标。则s与l相交当且仅当 x <= qx <= x’。
在这里插入图片描述
设 I := {[x1 : x1’ ], [x2 : x2’ ], …, [xn : xn’ ]}为实轴上的一组闭合区间。
令 xmid 为这 2n 个区间端点的中值(median)。
在该树的右子树中存放的,是由完全落在 xmid 右边的区间所组成的一个集 合 Iright;
在左子树中存放的,是由完全落在 xmid 左边的区间所组成的一个集合 Ileft。
对左、右两棵子 树,按照同样的方法进行递归构造。
对于由包含xmid的区间所组成的集合Imid,我们将其单独存储为另一个结构,并将该结构指 定给树的根节点。

在这里插入图片描述
根据xmid,对所有线段进行分类
在这里插入图片描述
qx 落在区间[xj : xj’] ∈ Imid 内,当且仅当 xj ≤ qx。

Data structure of interval tree

在这里插入图片描述
其中的垂直虚线,分别表示各节点所对应的xmid值

  • 若 I = ∅,则区间树为一匹叶子。
  • 否则,取xmid为所有区间端点的中值。令
    • Ileft := {[xj :xj’]∈I|xj’ <xmid}
    • Imid := {[xj :xj’]∈I|xj ≤xmid ≤xj’}
    • Iright:= {[xj : xj’] ∈ I | xmid < xj}
    • 其对应的区间树的根节点为 v,xmid 就存放在 v 处。此外,
    • 集合 Imid 被存储了两遍⎯⎯一次存放在按照各区间左端点排序的列表 Lleft(v)中,另一次存放在按照各区间右端点排序的列表 Lright(v)中;
    • v的左子树为与子集Ileft对应的一棵区间树;
    • v的右子树为与子集Iright对应的一棵区间树。

Lemma 10.2

An interval tree on a set of n intervals uses O(n) storage and has
depth O(logn).

任意 n 个区间所对应的区间树,占用 O(n)空间,深度为 O(logn)。

Algorithm CONSTRUCTINTERVALTREE(I)

递归构造区间树的算法
在这里插入图片描述
在这里插入图片描述
计算出 Imid,根据 Imid 构造出两个有序表: 所有左端点的有序表 Lleft(v) 所有右端点的有序表 Lright(v)
并将这两个列表存入 v 中

Lemma 10.3

An interval tree on a set of n intervals can be built in O(n log n) time.

一组共 n 个区间所对应的区间树,可以在 O(nlogn)时间内构造出来。

Algorithm QUERYINTERVALTREE(ν,qx)

借助区间树,找出包含 qx 的所有区间
在这里插入图片描述
**输入:**以 v 为根节点的一棵区间树,以及一个待查询点 qx
**输出:**包含 qx 的所有区间
当qx < xmid(v)时,遍历 Lleft(v),从其中最左侧端点所属的区间开始,逐一报告出包含 qx 的各区间 一旦到达不包含 qx 的(第)一个区间,即终止遍历。
否则,遍历列表 Lright(v): 从其中最右侧端点所属的区间开始,逐一报告出包含 qx 的各区间 一旦到达不包含 qx 的(第)一个区间,即终止遍历。 (这也是Lright要从右端开始排序的原因)

Theorem 10.4

An interval tree for a set I of n intervals uses O(n) storage and can be built in O(n log n) time. Using the interval tree we can report all intervals that contain a query point in O(log n + k) time, where k is the number of reported intervals.

给定一组共 n 个区间 I,其对应的区间树占用 O(n)空间,而且能够在 O(nlogn)时间内构造出来。对于 任一待查询点,都可以借助区间树,在 O(logn + k)时间内将包含该点的所有区间报告出来,其中 k 为实际被报告出来的区间数目。


推广: 垂直线段的查询
令SH ⊆ S为S中所有水平线段组成的子集,设q为一条垂直的待查询线段qx × [qy : qy’ ]。
对于SH中的任何一条线段s := [sx : sx’ ] × sy,我们将[sx : sx’ ]称为该线段的x-区间(x-interval)。
在这里插入图片描述
针对垂直线段的查询
增加了一个必要条件:s的y-坐标必须落在[qy : qy’ ]之间。
在这里插入图片描述
与q相交的每一条线段,其左端点必然落在阴影区域内

对于任一待查询区域(-∞ : qx’ ] × [qy : qy’ ],我们都能利用这一结构,将左端点落在该区域中的所有线段 报告出来。
反之,若q落在xmid的右侧,也应该能够将其右端点落在区域[qx : +∞) × [qy : qy’ ]中的所有
线段报告出来

向窗口查询转化

还需要一种关联结构,即利用第 5 章所介绍的二维区域树结构。
按照这种方法,关联结构将占用O(nmidlognmid) 的存储空间,其中nmid := card(Imid),而对应的查询时间则为O(lognmid + k)。

在每个节点 v 处,我们存放的不再是两个有序表 Lleft(v)和 Lright(v),而是如下的两棵区 域树:前一棵区域树 Tleft(v)存放的是 Imid(v)中所有线段的左端点;后一棵区域树 Tright(v)存放的是 Imid(v) 中所有线段的右端点。

现在的查询算法与 QUERYINTERVALTREE 基本相同,
二者只有一点差别:
不再是对有 序表 Lleft(v)进行遍历(traversal),而是对区域树 Tleft(v)进行查询。

Theorem 10.5

Let S be a set of n horizontal segments in the plane. The segments intersecting a vertical query segment can be reported in O(log2 n + k) time with a data structure that uses O(n log n) storage, where k is the number of reported segments. The structure can be built in O(nlogn) time.

设 S 为平面上的一组共 n 条水平线段。对于任一垂直待查询线段(query segment),我们都可在 O(log2n + k)时间内,将 S 中与该线段相交的所有线段报告出来,其中 k 为实际被报告出来的线段条数;为 此需要借助一个数据结构,该结构占用 O(nlogn)空间,并可在 O(nlogn)时间内被构造出来。

(又是一个用空间换时间的典型例子)

Corollary 10.6

Let S be a set of n axis-parallel segments in the plane. The segments intersecting an axis-parallel rectangular query window can be reported in O(log2 n + k) time with a data structure that uses O(n log n) storage, where k is the number of reported segments. The structure can be built in O(n log n) time.

设 S 为平面上一组共 n 条与坐标轴平行的线段。对于任一与坐标轴平行的矩形查询窗口,我们都可 在 O(log2n + k)时间内,将 S 中与该截窗相交的所有线段报告出来,其中 k 为实际被报告出来的线段 条数;为此需要借助一个数据结构,该结构占用 O(nlogn)空间,并可在 O(nlogn)时间内被构造出来。

10.2 Priority Search Trees

设P := {p1, …, pn}为平面上的一组点。我们希望设计出一种结构,来求解形如(-∞ : qx] × [qy : qy’ ] 的矩形查询。
在这里插入图片描述
集合{1, 3, 4, 8, 11, 15, 21, 22, 36}对应的一个堆

堆的树形结构还有另一个优点:它可以使得对 y-坐标的集成更加容易。

得益于堆的灵活性,每个集合都可以任意地划分为两个子集。
如果还希望对y-坐标进行查找, 就可以采用一个技巧⎯⎯在划分子集的时候,不是像普通的堆那样随意进行划分,而是根据y-坐标 来进行划分。
在这里插入图片描述
在该图中,树被画成了朝向侧面的,其目的是为了说明此处的划分是按照y-坐标 进行的。
点p5 的x-坐标最小,所以存放在根节点中。其余的(五个)点按照 y-坐标一分为二。其中,点p3、p4 和p6 的y-坐标更小,所以归入左子树。在这三个点中,p3 的x-坐标 最小,于是该点就存放在左子树的根节点处。依此类推。

Definition of priority search tree

  • 若 P = ∅,则对应的优先查找树为一匹空的叶子。
  • 否则,设pmin为集合P中x-坐标最小的那个点。
  • 令ymid为其余诸点y-坐标的中值。
    • 取 Pbelow := {p ∈ P{pmin} | py < ymid}
    • 取Pabove := {p ∈ P{pmin} | py > ymid}
  • 对应的优先查找树的根节点为 v,其中存放了点 p(v) := pmin,以及数值 y(v) := ymid。
  • 此外, v的左子树为对应于集合Pbelow的一棵优先查找树;
  • v的右子树为对应于集合Pabove的一棵优先查找树。

在这里插入图片描述
对一棵优先查找树进行查询

Query algorithm for a heap

REPORTINSUBTREE(ν,qx)
在这里插入图片描述
**输入:**以 v 为根节点的一棵优先查找树,以及数值 qx
**输出:**该子树中 x-坐标不超过 qx 的所有点

Lemma 10.7

REPORTINSUBTREE(ν,qx) reports in O(1+kν) time all points in the subtree rooted at ν whose x-coordinate is at most qx, where kν is the number of reported points.

REPORTINSUBTREE(v, qx)可以在 O(1 + kv)时间内,从以 v 为根节点的子树中,将 x-坐标不超过 qx 的所 有点报告出来,其中 kv 为实际被报告出来的点数。

Query algorithm based on priority search tree

Algorithm QUERYPRIOSEARCHTREE(T,(−∞ : qx]×[qy : qy])

在这里插入图片描述
**输入:**一棵优先查找树 T,以及一个左侧无界的待查询区域
**输出:**落在该区域内的所有点

Lemma 10.8

Algorithm QUERYPRIOSEARCHTREE reports the points in a query range (−∞ : qx]×[qy : qy] in O(logn+k) time, where k is the number of reported points.

算法 QUERYPRIOSEARCHTREE 可以在 O(logn + k)时间内,报告出落在待查询区域(-∞ : qx] × [qy : qy’ ]内 的所有点,其中 k 为实际被报告出来的点数。

Theorem 10.9

A priority search tree for a set P of n points in the plane uses O(n) storage and can be built in O(n log n) time. Using the priority search tree we can report all points in a query range of the form (−∞ : qx] × [qy : qy] in O(log n + k) time, where k is the number of reported points.

对于由平面上任意 n 个点组成的集合 P,我们都可在 O(nlogn)时间内为其构造出一棵占用 O(n)存储空 间的优先查找树。借助这棵优先查找树,对于任何形如(-∞ : qx] × [qy : qy’ ]的待查询区域,我们都可在 O(logn + k)时间内从 P 中找出落在该区域中的所有点,其中 k 为实际被报告出来的点数。

10.3 Segment Trees(线段树)

应用于印刷电路板设计
路线图包含任意方向的线段

bounding box
在这里插入图片描述

在最坏的情况下,所有边界框可以与W相交,而没有任何分段
在这里插入图片描述

窗口化的两种情况:在窗口中具有端点的段和与窗口边界相交的段。
**问题:**在S中找到与垂直查询段相交的段
在这里插入图片描述
线段方向任意时,截窗查询无法分解为沿两个正交方向的两次查询

设I := {[x1 : x1’ ], [x2 : x2’ ], …, [xn : xn’ ]}为实轴上的一组共n个区间。我们所希望找到的数据结构,应该能够对任一待查询点qx,报告出S中包含qx的所有区间。
将各区间的端点从左到右排成序列p1, …, pm(其中剔除了重合的端点)。
如此分割所得到 的子区域,称作基本区间(elementary interval)。

划分出来的基本区间从左到右依次是:
在这里插入图片描述
基本区间

在这个基本区间的序列中,开区间与闭区间交替出现:每一个开区间,都介于某两个相邻端点 pi 和 pi+1 之间;而每一个闭区间,都是某一端点本身。

建立一棵二 分查找树 T,树中的叶子分别对应于各基本区间。与某匹叶子μ对应的基本区间,记作 Int(μ)。
在这里插入图片描述
将线段s存放在v处,而不是分别存放在μ1、μ2、μ3和μ4处
如上图所示,有一个区间跨越了五个基本区间。考察分别与基本区间μ1、μ2、μ3 和μ4 相对应的 四匹叶子。
如果针对qx的搜索路径终止在其中的某匹叶子处,我们就必须报告这段区间。
在这里插入图片描述
线段树:其中的节点通过箭头,指向对应的正则子集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Summer tree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值