R-tree 一种空间搜索的动态索引结构

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

时间: 2024-12-15 09:01:36

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

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

前言 在美团CRM系统中,搜索商家的效率与公司的销售额息息相关,为了让BD们更便捷又直观地去搜索商家,美团CRM技术团队基于Solr提供了空间搜索功能,其中移动端周边商家搜索和PC端的地图模式搜索功能为BD们的日常工作带来了很大的便利,大大提升了BD们的工作效率. 在本文中,首先对空间搜索的原理进行简单介绍,然后再结合具体的业务场景去分享美团使用空间搜索的实践. 空间搜索原理 空间搜索,又名Spatial Search,基于空间搜索技术,可以做到: 1)对Point(经纬度)和其他的几何图形建索

SQLite R*Tree 模块测试

目录 SQLite R*Tree 模块测试 1.SQLite R*Tree 模块特性简介 2.SQLite R*Tree 模块简单测试代码 SQLite R*Tree 模块测试 相关参考: MySQL空间索引简单使用 MongoDB地理空间数据存储及检索 The SQLite R*Tree Module Memory-Mapped I/O In-Memory Databases libspatialindex R* tree - Wikipedia 1.SQLite R*Tree 模块特性简介

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

[[email protected] ~]# ceph osd pool create harbor 128 Error ETIMEDOUT: crush test failed with -110: timed out during smoke test (5 seconds) //这个问题 我不知道怎么解决 因为过了一小会 就又好了 [[email protected] ~]# ceph osd pool create harbor 128 pool 'harbor' created [[e

PS去掉图片上的文字的6种基本方法,动态教程

1.使用仿制图章工具去除文字这是比较常用的方法.具体的操作是,选取仿制图章工具,按住Alt键,在无文字区域点击相似的色彩或图案采样,然后在文字区域拖动鼠标复制以复盖文字.要注意的是,采样点即为复制的起始点.选择不同的笔刷直径会影响绘制的范围,而不同的笔刷硬度会影响绘制区域的边缘融合效果. 2.使用修补工具去除文字如果图片的背景色彩或图案比较一致,使用修补工具就比较方便.具体的操作是,选取修补工具,在公共栏中选择修补项为“源”,关闭“透明”选项.然后用修补工具框选文字,拖动到无文字区域中色彩或图案

js+jquery动态设置/增加/删除/获取元素属性的两种方法集锦对比(动态onclick属性设置+动态title设置)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html140/strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>

实现类似微博、QQ空间等的动态加载

微博.QQ空间等的动态加载方式属于滚屏加载技术,获取当前滚动条位置来触发onscroll()函数,向服务器发起请求,将请求得到的新的数据动态加载在页面上 本文利用该原理实现了动态加载,但不是检测当前滚动条位置来触发函数,而是由按钮事件触发,因此更简单一些. 走过的弯路 1) 将目前读取到的数据库中的位置存放在session中,当要加载更多的时候,去session中获得该值,动态加载后修改session中的值 错误原因:session是有缓存的,如果停留在当前页面,得到的值还是一开始的sessio

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

             R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m") days31<-c("01","03","05","07","08","10","12") days30<-c("04",&

微信企业号两种常用搜索加载方式

微信企业端两种常用搜索方式 一:在搜索框中进行加载搜索结果 1.html部分代码和js部分代码 <div class="page__bd" style="height: 100%;"> <div class="weui-search-bar" id="searchBar"> <form class="weui-search-bar__form"> <div clas

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

MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上一篇博客中Dao接口实现类方法. Mapper接口开发需要遵循以下规范: (1)Mapper.xml文件中的namespace与mapper接口的类路