译林:R-tree 一种空间搜索的动态索引结构
Antonm Guttman

摘要
为了有效地处理空间数据,正如在计算机辅助设计和地理数据应用中所要求的那样,
数据库需要一种索引机制能根据它们的空间位置快速地取得数据项。
然而传统的索引方法并不能很好的适应位于多维空间中的非零大小的数据对象。
在这篇论文中,我们描述一种被称之为R-树的动态索引结构来满足这种需求,并且给出了对应的搜索和更新算法。
我们进行了一系列的测试,结果表明这种结构的性能很好,结论是它对于当前的数据库系统在空间应用十分有帮助。

1、引言

空间数据对象经常在多维空间中覆盖若干区域,不能很好的通过点的位置来表示。
例如,类似国家或人口普查区域等地图对象在二维空间中占据非零空间区域。
空间数据中一般的操作是搜索一个区域内所有的对象,例如找到一个给定点的20英里内所有的乡村。
这样的空间搜索在计算机辅助设计(CAD)和地理数据应用中经常会遇到,因此能根据所在的位置高效地取回对象变得十分重要。

得到基于对象空间位置的索引将是令人满意的,但是传统的一维数据库索引结构并不适用于多维的空间搜索。
基于数值的精确匹配数据结构,例如哈希表的作用也不大,因为需要进行范围搜索。
采用键值进行一维排序的数据结构,例如B-tree和ISAM索引也没有效果,因为搜索空间是多维的。

有很多的数据结构都被提出来处理多维点数据,这些方法的综述可以在[5]中找到。
cell方法[4,8,16]并不很适合于动态数据结构,因为必须提前确定cell的边界。
quad-trees[7]和k-d trees并没有考虑辅助存储器的分类。
K-D-B trees专门用于分页存储,但仅用于点数据。
在[15]中提出了利用索引区间,但是这种方法并不适用于多维空间。
角落拼接[12]是一种适合于在二维空间中搜索非零大小的数据对象的数据结构,但是它假定主存储器是均匀的,在大规模数据集中进行随机随机搜索的效率并不高。
grid files[10]通过将每个对象映射到更高维空间中的一个点。
在本文中,我们描述了一种被称之为R-tree的数据结构,用若干维度中的区间来表示数据对象。

第二部分概述了R-tree的结构,而第三部分给出了搜索,插入,删除和更新操作的算法。
R-tree索引性能的实验结果在第四部分描述。
第五部分包含了我们结论的一个概括。

2、R-tree索引结构

R-tree是一种类似于B-tree[2,6]的高度平衡的树,在它的叶节点的索引记录中包含了数据对象的指针。
如果索引是磁盘驻留式的,则这些节点应于磁盘的页面,这种数据结构设计为进行空间搜索时只需访问一小部分节点。
这种索引是完全动态的;插入和删除操作可以和搜索相互混合,而且不需要对树结构进行周期性地重新组织和维护。

空间数据库包含了用于表示空间对象的元组的集合,并且每个元组都有唯一的标识符用于取回元组。
R-tree中的叶节点包含的索引记录条目的形式为:
(I, tuple-identifier)
其中tuple-identifier指的是数据库中的一个元组,而I是n维的矩形,作为索引的空间对象的边框:
I=(I0,I1,...,In-1)
这里n是维数,Ii是一个[a,b]的闭区间,用于描述对象在第i维上的范围。
Ii可能会有一个或者两个都等于无限,这表明对象是向外无限拓展的。
非叶节点包含的条目的形式为:
(I,child-poiner)
其中child-pointer是R-tree中更下一层的节点的地址,I包含了在更下一层节点的条目中的所有矩形。

令M是在一个节点中最大的条目数,令m<=M/2是指定节点中最小条目数的参数。
R-tree满足下列特性:
(1)如果不是根节点,则每个叶节点包含m到M个索引记录
(2)对与在叶节点中的每个索引记录(I,tuple-identifier),I是由元组表示的空间上包含n维数据对象的最小矩形
(3)如果不是根节点,则每个非叶节点都包含m到M个子节点
(4)对于在非叶节点中的每个条目(I,child-poiner),I是空间上包含子节点的矩形中的最小的那个
(5)根节点如果不是叶节点,则至少包含2两个子节点
(6)所有的叶子都在同一层

图2 1a和图2 1b展示了R-tree的结构,并且描绘了树中矩形所包含范围和重叠关系

因为每个节点的分支因子至少为m,一个包含N个索引记录的R-tree的高度至多为|logmN|-1。
节点最多为ceiling(N/m)+ceiling(N/m^2)+1。
最坏情况下,除去根节点后所有节点的空间利用率为m/M。
节点的数目趋向于多于m个条目,这将降低树的高度并且提高空间利用率。
如果节点的条目多余3或4,这棵树就变得非常宽了,几乎所有的空间都被用来存储包含索引记录的叶节点。
m可以作为一个可调的参数而变化,在第四部分中进行了实验,测试了m的不同值。

3、搜索和更新

3.1 搜索
搜索算法以类似B-tree的方式从根节点一直向下进行。
然而,在一个访问过的节点下面有不止一颗子树需要进行搜索,因此并不能保证很好的最坏情况下的性能。
但是有了很多种的数据后,更新算法可以以一种高效的方式来维护树结构,这种方式允许搜索算法消除被索引空间中不相关的区域,并且只检查搜索区域邻近的数据。

R-tree 一种空间搜索的动态索引结构的更多相关文章

  1. 基于Solr的空间搜索

    如果需要对带经纬度的数据进行检索,比如查找当前所在位置附近1000米的酒店,一种简单的方法就是:获取数据库中的所有酒店数据,按经纬度计算距离,返回距离小于1000米的数据. 这种方式在数据量小的时候比 ...

  2. solr特点八:Spatial(空间搜索)

    前言 在美团CRM系统中,搜索商家的效率与公司的销售额息息相关,为了让BD们更便捷又直观地去搜索商家,美团CRM技术团队基于Solr提供了空间搜索功能,其中移动端周边商家搜索和PC端的地图模式搜索功能 ...

  3. [ElasticSearch] 空间搜索 (一)

    依据索引文档的地理坐标来进行搜索.Elasticsearch 也可以处理这种搜索.--空间搜索 一.为空间搜索准备映射 PUT my_space_test { "mappings" ...

  4. Solr 空间搜索配置、按经纬度计算距离排序

    Solr 空间搜索配置 1. 在solr目录下的找到conf文件夹下的schema.xml. <fields> <!-- 在fields元素中添加如下代码 --> <fi ...

  5. SQLite R*Tree 模块测试

    目录 SQLite R*Tree 模块测试 1.SQLite R*Tree 模块特性简介 2.SQLite R*Tree 模块简单测试代码 SQLite R*Tree 模块测试 相关参考: MySQL ...

  6. 基于ceph rbd 在kubernetes harbor 空间下创建动态存储

    [root@bs-k8s-ceph ~]# ceph osd pool create harbor 128 Error ETIMEDOUT: crush test failed with -110: ...

  7. 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类

    30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...

  8. MyBatis开发Dao层的两种方式(Mapper动态代理方式)

    MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...

  9. R语言两种方式求指定日期所在月的天数

                 R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ...

随机推荐

  1. PHP:微信小程序调用【统一下单】【微信支付】【支付回调】API;XML转Array,Array转XML方法(通用)

    1.微信公众号.微信小程序开发过程中,第三方服务器与微信服务器数据交互,需要进行数据转换,必须用到这两个函数: 分别是xml_to_array.array_to_xml ; /** * 输出xml字符 ...

  2. 老毛桃pe装机工具一键还原系统

    系统崩溃后,很多菜鸟朋友会六神无主,不知接下来怎么办.如果是老手,已经屡见不鲜了,因为只需一键还原系统就可以恢复到原来的工作状态.下面不妨跟小编一起继续看看怎么一键还原系统.  ①制作一个老毛桃win ...

  3. HDUOJ --2544最短路(基础)

    输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几 ...

  4. UE 技巧

    http://cache.baiducontent.com/c?m=9d78d513d98416b8599d830e7c01a7170e2585744ddcc4523f8a9c12d522195646 ...

  5. linux系统新建用户ssh远程登陆显示-bash-4.1$解决方法,ssh-bash-4.1

    linux系统新建的用户用ssh远程登陆显示-bash-4.1$,不显示用户名路径 网络上好多解决办法,大多是新建.bash_profile文件然后输入XXXXX....然而并没有什么用没有用.... ...

  6. 【ERROR】bash: vim: command not found的解决办法

    今天在学习鸟哥的菜的时候,发现自己linux不可以启用vim命令,错误为:bash: vim: command not found. 机器环境:VMWare8+RED HAT Enterprise5 ...

  7. mac下安装mysql 1820 重置默认密码

    mac安装mysql时会给出一个临时密码 记录下来 2018-03-17T02:14:10.809431Z 1 [Note] A temporary password is generated for ...

  8. 工作总结 ModelState.AddModelError("ShiYiObject", "对象不能为空!"); 小知识

    // // 摘要: // 获取包含模型状态和模型绑定验证状态的模型状态字典对象. // // 返回结果: // 模型状态字典. public ModelStateDictionary ModelSta ...

  9. 傅立叶级数(Fourier Series)和周期现象

    一.前言 如果你仔细观察,工作和生活中充满了周期现象:旁边linux driver工程师在调试audio driver的时候播放的1kHz的正弦信号,周末去公园游玩,游船推开水面的波纹,硬件工程师调试 ...

  10. unity, texture import settings

    如果图片带透明通道,则若勾选Alpha Is Transparency,图片会呈现透明的预览效果.   但Alpha Is Transparency勾选与否是否影响shader的输出效果目前我还不太清 ...