mysql的R树_GIS笔记——R树:一种用于空间查找的动态索引结构(算是节译)

R树简介。

R树是一种与B树类似的高度平衡树。这种索引是动态的,不需要定期重建。索引记录(Index Records)保存在叶节点中,索引记录包含指向数据对象的指针。注意原文中将索引的终端称为索引记录而不是空间对象。

空间数据库由一系列元组(tuple)构成,每个元组代表一个空间对象,并且每个元组都有一个唯一的标识符,标识符的作用是用于检索。

R树中的叶节点是以下面这种方式保存条目(entry)的:(I,tuple-identifier)。其中,I是一个n维矩形,表示空间对象的外廓矩形。Tuple-identifier是一个指向空间对象的指针。另外,原文中写到允许矩形I趋向于无穷大,却没有写到是否允许矩形I在某个维度上宽度为0。

R树中的非叶节点是这样保存条目的:(I,child-pointer)。其中,I是其所有子节点的外廓矩形的总外廓矩形。Child-pointer是指向下一级节点的指针。

原文中的表达方式似乎表明,节点中保存有多个条目,每个条目都有一个外廓矩形。我过去认为每个节点有一个外廓矩形及若干指针。但是从原文来看,我过去的理解是错误的。原文是这样的“Non-leaf nodes contain

entries of the form (I,child-pointer)”

记M为一个节点中的最大条目数。取m<=M/2,约定此m为一个节点中的最小条目数。此时,R树具有如下性质:

(1)若叶节点不是根节点,则每个叶节点所包含的索引记录个数介于m与M之间

(2)对于叶节点中的索引记录(I,tuple-identifier),I是其最小外包矩形。

(3)若非叶节点不是根节点,则其中包含的子节点个数介于m与M之间。

(4)对于非叶节点中的条目(I,child-pointer),I表示能够覆盖其所有子节点的外包矩形的外包矩形。注意原文中没有使用索引记录(index

record)这个词,而用了条目(entry)。

(5)根节点若非叶节点,则其至少有两个子节点。

(6)所有叶子节点都在同一层。

一个有N个索引记录的R树,其高度最大为logm(N)-1,这是因为其每个节点至少要有m个记录。节点的总个数最多为N/m + N/m2 + …… + 1。最差的情况下,除根节点外的各节点空间利用率为m/M。通常情况下节点中的条目数不会只有m个,所以树的实际高度通常小于logm(N)-1,空间利用率通常高于m/M。如果节点中有超过3或4个条目,这个R树就会非常宽,从而导致绝大多数空间都用于保存叶节点,也就是保存索引记录。我无法理解原文是赞成这一现象还是反对这一现象。不同的m值会影响索引的性能。

搜索算法

R树搜索算法与B树类似,都是从根节点向下搜索。然而,在搜索到某个节点后,接下来可能需要搜索这个节点下属的几个子树(而不是只搜索其中一个)。也就是说,搜索不是单向的。因此,在某些糟糕的情况下,R树可能无法保证性能。虽然如此,对于绝大多数的数据来说,R树的更新算法可以保证R树有一个相对较好的结构,能够保证在进行搜索的时候,无关的区域不会参与检索,只有在搜索区域附近的数据才会被检索(examine)。

下面描述搜索算法Search。我们将一个索引条目(Index Entry)记为E,其中的外廓矩形记为EI,其中的指针,不管它是叶节点中的指针还是中间节点中的指针,我们均将其记为Ep。下文均使用类似的约定。

算法Search:

记R树的根节点记为T。搜索算法要求输入一个搜索矩形S,输出所有与S相交的索引记录。

步骤S1:搜索子树——如果T不是一个叶节点,则检查其中的每一个条目E,如果EI与S相交,则对Ep所指向的那个子树根节点调用Search算法。这里注意,Search算法接收的输入为一个根节点,所以在描述算法的时候,原文称对子树根节点调用Search算法,而不是对子树调用Search算法。

步骤S2:搜索叶节点——如果T是一个叶节点&#

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值