目录
1.一维几何范围查找(1d-Geometric Range Query)
2.二维几何范围查找(2d-Geometric Range Query)
几何范围查找问题描述:给定一系列数据点,每给一个bounding box(他的边平行于坐标轴),输出该区域内部的点(reporting)以及点的个数(counting)
1.一维几何范围查找(1d-Geometric Range Query)
问题描述:给定数轴上的一系列点,每给一个区间(这里限制是左开右闭区间),输出该区间内部的点(reporting)以及点的个数(counting)。
最简单的想法:将每个点进行查询,查询该点是否位于该区间内部。时间复杂度。
二分查找
首先进行预处理,再进行二分查找。
很遗憾,上述一维二分查找的想法不能直接迁移到二维上面。
在一维的情况下,构造平衡二叉查找树(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算法举例:
报告加查询的时间复杂度:,其中r为报告元素的个数,推广到n维的情况:
改进想法:采用两次一维查找,分别是x-query和y-query,组成trees of tree多层搜索树结构。
算法过程:
报告加查询的时间复杂度:,其中r为报告元素的个数,推广到n维的情况: