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& ...
随机推荐
- ORACLE经常使用命令
1 怎样查看数据库中都有什么表? select * from sys.user_tables; 2 怎样链接数据库 sqlplus /nolog;conn sys/oracle as sysdba; ...
- word使用宏定义来统一设置图片大小
1. 首先手动拖拽将图片调到需要的格式,点击图片在格式选项中查看图片的宽高 2. 视图中点击宏新建 3. 编辑框中输入以下代码并保存,由于我只需要统一宽度,所以将统一高度的代码注释 Sub 图片格式统 ...
- 浅谈软件配置管理工具(github & SVN)
1 配置管理名词定义 1.1 配置项 软件生存周期各个阶段活动的产物经审批后即可称之为软件配置项. 软件配置项包括: ①与合同.过程.计划和产品有关的文档和资料: ②源代码.目标代码和可执行代码: ...
- 【LeetCode】25. Reverse Nodes in k-Group (2 solutions)
Reverse Nodes in k-Group Given a linked list, reverse the nodes of a linked list k at a time and ret ...
- 堆 C语言实现
1.基本概念 堆分为小根堆和大根堆,对于一个小根堆,它是具有如下特性的一棵完全二叉树: (1)若树根结点存在左孩子或右孩子,则根结点的值(或某个域的值)小于等于左右孩子结点的值(或某个域的值) (2) ...
- vi命令速查图
Lesson 1 Lesson 2 Lesson 3 Lesson 4 Lesson 5 Lesson 6 Lesson 7
- Android Fragment之间传递List数据
要说的是在两个Fragment之间传递List数据,比如有个List<User>,以及传递字符串数据,比如testId,该如何从FragmentA传递到FragmentB呢? 下面这个例子 ...
- asp mvc @Html.CheckBox("sel",true) 往后台传值问题
@Html.CheckBox("sel",true) 生成2个输入,而不是一个,这是为什么呢? <input checked="checked" id=& ...
- Python3 列表 clear() 方法
描述 Python3 列表 clear() 方法用于清空列表,类似于 del a[:]. 语法 clear() 方法语法: L.clear() 参数 无. 返回值 该方法没有返回值. 实例 以下实例展 ...
- keras在win7下环境搭建
无gpu安装过程:一.卸载之前版本. 把之前单独安装的Python等统统卸载掉.学python的时候直接安装了python2.7,先把他卸载掉,因为Anaconda里边包含了python.二.安装A ...