计算几何学习——几何范围查找

目录

1.一维几何范围查找(1d-Geometric Range Query)

2.二维几何范围查找(2d-Geometric Range Query)


几何范围查找问题描述:给定一系列数据点,每给一个bounding box(他的边平行于坐标轴),输出该区域内部的点(reporting)以及点的个数(counting)

1.一维几何范围查找(1d-Geometric Range Query)

问题描述:给定数轴上的一系列点,每给一个区间(这里限制是左开右闭区间),输出该区间内部的点(reporting)以及点的个数(counting)。

最简单的想法:将每个点进行查询,查询该点是否位于该区间内部。时间复杂度O(n)

二分查找

首先进行预处理,再进行二分查找。

很遗憾,上述一维二分查找的想法不能直接迁移到二维上面。

在一维的情况下,构造平衡二叉查找树(BBST):每个根节点是其左子树的最大值,根节点所有的左子树上的元素都会不大于根节点的元素,根节点所有的右子树上的元素都会大于根节点的元素,

举例:

2.二维几何范围查找(2d-Geometric Range Query)

问题描述:

假设R为左开右闭,下开上闭:

一维情况下的BBST在二维情况下的推广:将平面递归划分,并将这些划分后的区域组织成一棵kd-tree。

划分步骤:将区域分别横向/纵向尽可能均匀划分(每偶数次划分为竖直方向,每奇数次划分为水平方向),从而递归划分成一个个子区域。如下所示:

将这些区域组织成一棵kd-tree:

构造过程:

步骤举例:

kd查找的伪代码:

KdSearch(v,R)

if (isleaf(v)){  // v是叶子结点
   if (inside(v,R))  // v在R的内部
      report(v);
   return;
}
if (region(v->lc) is belongs to R) // v的左子树属于R
   reportSubtree(v->lc);
else if(inersect(region(v->lc),R))  // v的左子树与R有交集,但不全属于R
   kdSearch(v->lc,R);
if (region(v->rc) is belongs to R)
   reportSubtree(v->rc);
else if(inersect(region(v->rc),R))
   kdSearch(v->rc,R);

kd-tree算法举例:

报告加查询的时间复杂度:O(r+\sqrt{n}),其中r为报告元素的个数,推广到n维的情况:

改进想法:采用两次一维查找,分别是x-query和y-query,组成trees of tree多层搜索树结构。

算法过程:

 报告加查询的时间复杂度:O(r+log^{2}(n))),其中r为报告元素的个数,推广到n维的情况:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值