$B$ 树的搜索本质上是一维区间的划分过程,每次搜索节点所找到的子节点其实就是一个子区间。$R$ 树是把 $B$ 树的思想扩展到了多维空间,
采用了 $B$ 树分割空间的思想,是一棵用来存储高维数据的平衡树。
对于一棵 $R$ 树,叶子节点所在层次称为 $Level \; 1$,根节点所在层次称为 $Level \; h$。一棵 $R$ 树满足如下性质:
1)除根结点之外,所有非根结点包含有 $m$ 至 $M$ 个记录索引(条目)。根结点的记录个数可以少于 $m$。通常 $m=\frac{M}{2}$。
2)每一个非叶子结点的分支数和该节点内的条目数相同,一个条目对应一个分支。所有叶子结点都位于同一层,因此 $R$ 树为平衡树。
3)叶子结点的每一个条目表示一个点。
4)非叶结点的每一个条目存放的数据结构为:$(I, child-pointer)$。$child-pointer$ 是指向该条目对应孩子结点的指针。$I$ 表示
一个 $n$ 维空间中的最小边界矩形($minimum \; bounding \; rectangle$,即 $MBR$),$I$ 覆盖了该条目对应子树中所有的矩形或点。
两个黑点保存在一个叶子节点的两个条目中,恰好框住这两个条目的矩形表示为:$I=(I_0,I_1)$。其中 $I_0=(a,b),I_1=(c,d)$,也就
是说最小边界矩形是用各个维度的边来表示,在三维空间中那就是立方体,用 $3$ 条边就可以表示了。
下面构建一棵 $R$ 树。如下左图,理论上,点可以任意组合成叶节点,只要 $MBR$ 包含它子树中的所有点。特别是 $MBR$ 可以重叠。下面
右图是另一种组合建立的 $R$ 树。
哪种分组更好呢?一般分组的原则就是最小化每个 $MBR$ 矩形,这样查询的时候发生的相交情况会越少,查询的分支就越少,查询效率越高。
R-tree 查询
介绍查询之前,需要先了解下:如何判断两个线段或者两个矩形是否相交?
1. Range Query
这种查询输入的是一个矩形所表示的范围,要求输出该范围内的所有点。从根节点开始,通过判断目标矩形和节点内的每一个条目对应的
矩形是否相交来选择下一步查询的节点,如果有多个条目都相交,那对应的各个分支都得查。到达叶子节点后,就判断该叶子节点的每一
个条目是否在查询区域内即可。
现在想查询在矩形