译林: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. BIND9源码分析之acl 的实现

    BIND配置中一大堆一大堆的acl,什么allow-query, allow-recursion, allow-update还有view的match-clients等等等等. acl中的主要存储的就是 ...

  2. HDUOJ------1711Number Sequence

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. Java Socket 编程之Socket与ServerSocket的区别

    http://www.cnblogs.com/hq-antoine/archive/2012/02/11/2346474.html 1.1 ServerSocket类    创建一个ServerSoc ...

  4. 关于JavaScript中Get/Set访问器

    有时候大家可能会纳闷,在使用JavaScript的时候,只需要给一个系统变量赋值就可以触发一系列操作去相应. 但是我们在写Js的时候,修改了一个自定义变量,却连个P都没有.是不是很郁闷呢? 其实,我们 ...

  5. input text的所有事件

    onBlur 当 text field失去聚焦的时候执行一些代码 onChange 当 text field失去聚焦并且它的值发生变动的时候执行一些代码 onClick 当用户在 text field ...

  6. Linux内核同步 - 原子操作

    一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个位于memory中的变量的值到寄存器中 2.修改该变量的值(也就是修改寄存器中的值) 3.将寄存器中的数值写回memory中的变量值 如果这 ...

  7. NewsLetter001

    http://www.learn-english-today.com/ Project management - Iron out problems. – resolve issues. Critic ...

  8. 使用国内镜像composer安装laravel

    1.安装 Laravel,创建blog项目 首先先说一下直接安装的方法,要想使用这个方法,首先要FQ(这是我们的基本国情决定的).这样的安装方式有两种: ①.全局安装 使用命令Laravel Inst ...

  9. 配置 Sliverlight 跨域访问策略

    Silverlight程序在访问非本域资源时,需要在相应的域根目录下建立跨域访问策略文件才能进行访问. 文件名:clientaccesspolicy.xml 文件内容: <?xml versio ...

  10. Windows Azure Mobiles Services实现client的登录注冊

    下文仅仅是简单实现,client以Android端的实现为例: 用户表Account: package com.microsoft.ecodrive.model; public class Accou ...