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的方式从根节点一直向下进行。
然而,在一个访问过的节点下面有不止一颗子树需要进行搜索,因此并不能保证很好的最坏情况下的性能。
但是有了很多种的数据后,更新算法可以以一种高效的方式来维护树结构,这种方式允许搜索算法消除被索引空间中不相关的区域,并且只检查搜索区域邻近的数据。
R-tree 一种空间搜索的动态索引结构的更多相关文章
- 基于Solr的空间搜索
如果需要对带经纬度的数据进行检索,比如查找当前所在位置附近1000米的酒店,一种简单的方法就是:获取数据库中的所有酒店数据,按经纬度计算距离,返回距离小于1000米的数据. 这种方式在数据量小的时候比 ...
- solr特点八:Spatial(空间搜索)
前言 在美团CRM系统中,搜索商家的效率与公司的销售额息息相关,为了让BD们更便捷又直观地去搜索商家,美团CRM技术团队基于Solr提供了空间搜索功能,其中移动端周边商家搜索和PC端的地图模式搜索功能 ...
- [ElasticSearch] 空间搜索 (一)
依据索引文档的地理坐标来进行搜索.Elasticsearch 也可以处理这种搜索.--空间搜索 一.为空间搜索准备映射 PUT my_space_test { "mappings" ...
- Solr 空间搜索配置、按经纬度计算距离排序
Solr 空间搜索配置 1. 在solr目录下的找到conf文件夹下的schema.xml. <fields> <!-- 在fields元素中添加如下代码 --> <fi ...
- SQLite R*Tree 模块测试
目录 SQLite R*Tree 模块测试 1.SQLite R*Tree 模块特性简介 2.SQLite R*Tree 模块简单测试代码 SQLite R*Tree 模块测试 相关参考: MySQL ...
- 基于ceph rbd 在kubernetes harbor 空间下创建动态存储
[root@bs-k8s-ceph ~]# ceph osd pool create harbor 128 Error ETIMEDOUT: crush test failed with -110: ...
- 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类
30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...
- MyBatis开发Dao层的两种方式(Mapper动态代理方式)
MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...
- R语言两种方式求指定日期所在月的天数
R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ...
随机推荐
- 算法:辗转相除法【欧几里德算法(Euclidean algorithm)】
1.来源 设两数为a.b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1).若r1=0,则(a,b)=b:若r1≠0,则再用b除以 ...
- cxf之java.lang.NoSuchMethodError: org.springframework.aop.support.AopUtils.isCglibProxyClass(Ljava/lang/C
想用cxf发布一个web服务,但是容器启动报这个错,求高人解答啊 [问题点数:20分,无满意结帖,结帖人shijing266] 楼主好懒,主要还是jar版本的问题,spring4.2.0以上需要使用c ...
- InteliJ Idea通过maven创建webapp
facet是IDE给工程添加的属性,在使用maven时一定不能使用facet 一.创建maven项目,选定webapp作为archtype,这样就会自动生成webapp目录 如果没有给maven设置代 ...
- Python Socket编程初探
python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...
- C#:小写金额转换为大写
#region 小写金额转换为大写 public static string CurrToChnNum(double Currnum) { string sResult = ""; ...
- List 集合remove问题
java的list集合中.使用remove删除元素: 方法一: static List<Integer> list3 = new ArrayList<Integer>(); s ...
- Googleplay从服务器检索信息时出错。[DF-DFERH-01]
googleapis.cn services.googleapis.cn 两个地址强制走代理就OK了.
- Installing .NET Core on Ubuntu-摘自网络
Installing .NET Core on Linux By Zlatko Knezevic These instructions will lead you through acquiring ...
- Java总结篇系列:Java多线程(四)
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...
- Oracle学习笔记之六(DDL:表、索引、视图、同义词、序列操作相关SQL)
下面这些基本的SQL语句应该熟悉,能够灵活运用.最好在不查资料的情况下,能够写出如下的任何代码. 1. 数据表操作相关 --创建表 create table STUDENTS( STUNO ) not ...