RTree算法及介绍

空间索引是对存储在介质上的数据位置信息的描述,用来提高系统对数据获取的效率。GIS涉及的各种海量复杂数据存储于外存,如果对磁盘上的数据的位置不加以记录和组织,每查询一个数据项都要扫描整个数据文件,则这种访问磁盘的代价将严重影响系统的效率。因此索引的建立与处理至关重要。此外GIS所表现的地理数据多维性使得传统的B树索引不再适合,因为B树所针对的字符、数字等传统数据类型是在一个良序集之中,即都是在一个维度上,集合中任给两个元素,都可以在这个维度上确定其关系只可能是大于、小于、等于三种,若对多个字段进行索引,必须指定各个字段的优先级形成一个组合字段,而地理数据的多维性,在任何方向上并不存在优先级问题,因此B树并不能对地理数据进行有效的索引,所以需要研究特殊的能适应多维特性的空间索引方式。

1984年Guttman发表了《R树:一种空间查询的动态索引结构》[1]一种高度平衡树,由中间节点和叶节点组成,实际数据对象的最小外接矩形存储在叶节点中,中间节点通过聚集其低层节点的外接矩形形成,包含所有这些外接矩形。其后,人们在此基础上针对不同空间运算提出了不同改进,才形成了一个繁荣的索引树族,是目前流行的空间索引。

R树是一种采用对象界定技术的高度平衡树,是B 树在 k 维空间上的自然扩展,它将空间对象按范围划分,每个结点都对应一个区域和一个磁盘页,非叶结点的磁盘页中存储其所有子结点的区域范围,非叶结点的所有子结点的区域都落在它的区域范围之内;叶结点的磁盘页中存储其区域范围之内的所有空间对象的外接矩形。每个结点所能拥有的子结点数目有上、下限,下限保证对磁盘空间的有效利用,上限保证每个结点对应一个磁盘页,当插入新的结点导致某结点要求的空间大于一个磁盘页时,该结点一分为二。R树是一种动态索引结构,即:它的查询可与插入或删除同时进行,而且不需要定期地对树结构进行重新组织。

R-Tree数据结构

(1)R-Tree是n叉树,n称为R-Tree的扇(fan)。

(2)每个结点对应一个矩形。

(3)叶子结点上包含了小于等于n的对象,其对应的矩为所有对象的外包矩形。

(4)非叶结点的矩形为所有子结点矩形的外包矩形。

R-tree具有以下性质:

(1)除根节点外,每个节点的项数介于最小项数m和最大项数M之间;

(2)根节点至少有两个孩子,除非它是叶子节点;

(3)所有叶子节点位于同一层;

(4)同一节点中项,其排列没有顺序要求

R-Tree的的评价标准为:

(1)位置上相邻的结点尽量在树中聚集为一个父结点。

(2)同一层中各兄弟结点相交部分比例尽量小。

R树是一种用于处理多维数据的数据结构,用来访问二维或者更高维区域对象组成的空间数据.R树是一棵平衡树。树上有两类结点:叶子结点和非叶子结点。每一个结点由若干个索引项构成。对于叶子结点,索引项形如(Index,Obj_ID)。其中,Index表示包围空间数据对象的最小外接矩形MBR,Obj_ID标识一个空间数据对象。对于一个非叶子结点,它的索引项形如(Index,Child_Pointer)。 Child_Pointer指向该结点的子结点。Index仍指一个矩形区域,该矩形区域包围了子结点上所有索引项MBR的最小矩形区域。一棵R树的如图1所示。

R-Tree算法描述

(I)插入算法

     基本思想:找到合适的叶子节点,插入之,若需分裂,则由下至上调整MBR值。算法如下:

     I1: 调用ChooseLeaf来选择一个合适的叶子节点L以容纳需插入项E

     I2: 若L中还能容纳E,则加入之;否则调用SplitNode来获取两个节点L和LL,它们包含E和L中原有的所有项

     I3: 调用AdjustTree,传递参数L,LL(若产生了分裂)

     I4: 若节点分裂向上传播导致根节点的分裂,则生成新的根节点。

算法ChooseLeaf: 选择一个合适的叶子节点以放置新项E。合适的评价标准是插入E后的节点MBR面积增加度最少。

     C1: 设N指向根结点root

     C2: 若N是叶子节点,返回N  

     C3: 若N不是叶子节点,让F表示N中的一项,该项F容纳E后,则N在面积上只需作面积最小扩展

     C4: 设N指向叶子节点,则返回C2.

算法AdjustTree: 从叶子节点向根节点进行调整

     A1: 设N=L,若L进行了分裂,则设NN=LL

     A2: 若N为根节点,则返回

     A3: 设P为N的双亲节点,EN为节点P中指向N的项,调整项EN的MBR

     A4: 若NN存在,创建一个新项ENN,使其指向NN,同时计算出ENN的MBR.将ENN加入P,若不能容纳则调用SplitNode产生节点P和PP,包含ENN和原来P中所有项

     A5: 设N=P, NN=PP, 转至A2.

算法SplitNode: 将M+1项分成两组,将它们加入到两个新节点。

判断节点分裂好坏的一个标准为:分裂后,两个新节点对应的MBR的面积之和最小。下图展示了节点分裂的一个例子。

一个时间复杂度为二次(Quadratic)的分裂算法如下:

      S1: 调用PickSeeds选出两项,将它们分别作为两组的第一个元素;

      S2: 若所有项都已分配完,则返回;若一组中的项如此之少,以至于将剩下的所有项添至其中才能满足项数达到m的要求,则进行分配且返回;

      S3: 调用PickNext选择下一项,将其分配到某组中,该组在容纳该项后,MBR只需作最小面积扩展,转至S2.

算法PickSeeds:

      PS1: 对每一项E1和E2,计算d=area(E1和E2合并之后的MBR) – area(E1) – area(E2);

      PS2:选择d值最大的一对项。

算法PickNext:

      PN1:对每一项E,计算d1=<将E加入组1后MBR增加的面积>,同理计算d2;

      PN2:选出d1和d2值差距最大的项。

(2)R-tree删除算法

算法Delete(Entry E):从R-tree中删除项E

D1:调用FindLeaf来寻找存放E的叶子结点L ;若没有找到则停止;

D2:从L中删去E;

D3:调用CondenseTree,传递参数L :

D4::若根结点只有一个孩子,则让该孩子结点成为新根节点。

算法FindLeaf (NODE  T,  Entry  E )

FL1:若T不是叶子结点,则对于T中每一个与E相重叠的项,将该项所指的结点作参数,递归调用FindLeaf

FL2:若T是叶子结点,则检查T中是否有与E相等的项,若有,则返回T

算法CondenseTree :传递参数结点L ,该结点进行了删除项的操作

CT1:设N=L ,将存储被删结点的集合Q置为空;

CT2:若N是根,转至CT6;否则,设P为N的父节点,EN为P中指向N的项;

CT3:若N中的项数小于m,在P中删除EN,并把N加入到集合Q中;

CT4:若N没有被删除,调整EN的MBR;

CT5:设N=P,转向CT2;

CT6:重新插入集合Q中所有节点中的所有项,对于叶子节点中的项仍插入到叶子节点

中,但对于中间节点的项需要插入到其原来所在的那一层。


R树主要变体

R树最初由Guttman于1984年提出,其后,人们在此基础上针对不同的空间操作需求提出了各种改进方案。经过二十多年的发展,不断产生的R树变体逐渐形成了一个枝繁叶茂的空间索引R树家族。

1 R+树[2]

在Guttman的工作的基础上,许多R树的变种被开发出来, Sellis等提出了R+树[10],R+树与R树类似,主要区别在于R+树中兄弟结点对应的空间区域无重叠,这样划分空间消除了R树因允许结点间的重叠而产生的“死区域”(一个结点内不含本结点数据的空白区域),减少了无效查询数,从而大大提高空间索引的效率,但对于插入、删除空间对象的操作,则由于操作要保证空间区域无重叠而效率降低。同时R+树对跨区域的空间物体的数据的存储是有冗余的,而且随着数据库中数据的增多,冗余信息会不断增长。

2 R*树[3]

在1990年,Beckman和Kriegel提出了最佳动态R树的变种——R*树[11]。R*树和R树一样允许矩形的重叠,但在构造算法R*树不仅考虑了索引空间的“面积”,而且还考虑了索引空间的重叠。该方法对结点的插入、分裂算法进行了改进,并采用“强制重新插入”的方法使树的结构得到优化。但R*树算法仍然不能有效地降低空间的重叠程度,尤其是在数据量较大、空间维数增加时表现的更为明显。R*树无法处理维数高于20的情况。

3 QR树

QR树利用四叉树将空间划分成一些子空间,在各子空间内使用许多R树索引,从而改良索引空间的重叠。QR树结合了四叉树与R树的优势,是二者的综合应用。实验证明:与R树相比,QR树以略大(有时甚至略小)的空间开销代价,换取了更高的性能,且索引目标数越多,QR树的整体性能越好。

4 SS树

SS树对R*树进行了改进,通过以下措施提高了最邻近查询的性能:用最小边界圆代替最小边界矩形表示区域的形状,增强了最邻近查询的性能,减少将近一半存储空间;SS树改进了R*树的强制重插机制。当维数增加到5是,R树及其变种中的边界矩形的重叠将达到90%,因此在高维情况(≧5)下,其性能将变的很差,甚至不如顺序扫描。

5 X树

X树是线性数组和层状的R树的杂合体,通过引入超级结点,大大地减少了最小边界矩形之间的重叠,提高了查询效率。X树用边界圆进行索引,边界矩形的直径(对角线)比边界圆大,SS树将点分到小直径区域。由于区域的直径对最邻近查询性能的影响较大,因此SS树的最邻近查询性能优于R*树;边界矩形的平均容积比边界圆小,R*树将点分到小容积区域;由于大的容积会产生较多的覆盖,因此边界矩形在容积方面要优于边界圆。SR树既采用了最小边界圆(MBS),也采用了最小边界矩形(MBR),相对于SS树,减小了区域的面积,提高了区域之间的分离性,相对于R*树,提高了邻近查询的性能。

参考文献

[1] A. Guttman. R-Trees: a dynamic index structure for spatial searching. In SIGMOD Conference, 1984.

[2]Sellis T. K. ,Roussopoulos N. , Faloutsos C. . The R+-tree: A dynamic index for multidimensional objects. In Proceedings of the 13th VLDB, Brighton, England, 1987,  507~ 518.

[3]Beckmann N. , Kriegel H. P. , Schneider R. , Seeger B. . The R*-tree: An efficient and robust access method for points and rectangle. In: Proceedings of SIGMOD, Atlantic City, New Jersey, 1990, 322~331.

http://blog.csdn.net/jiqiren007/archive/2010/03/14/5377750.aspx

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件桌面跟计算机同步删除吗,电脑里桌面文件被不慎覆盖了如何恢?

2007-10-30如何恢复桌面图标不小心将某个程序的桌面Windows桌面图标是启动计算机一定程序或文档的开关,Windows桌面的图标分为两类&#xff1a;快捷图标和默认图标。快捷图标主要由应用程序安装时自动创建或计算机使用者人为创建&#xff0c;用一个从左下向右上斜指的小箭头来标…

win10易升_微软Win10版本20H2正式版官方ISO镜像下载大全_windows10_Windows系列_操作系统...

10月21日&#xff0c;微软推送了 Windows 10 十月更新版 20H2 系统更新。我个人认为微软 Win10 版本 20H2 正式版官方 ISO 镜像下载大全&#xff1a;此次系统版本(20H2)更新相对于上一版 20H1 正式版&#xff0c;这次十月更新的 20H2 正式版可能是很棒的一个版本&#xff0c;因…

乐观锁的两种实现方式

什么场景下需要使用锁&#xff1f; 在多节点部署或者多线程执行时&#xff0c;同一个时间可能有多个线程更新相同数据&#xff0c;产生冲突&#xff0c;这就是并发问题。这样的情况下会出现以下问题&#xff1a;更新丢失&#xff1a;一个事务更新数据后&#xff0c;被另一个更新…

c++编译时候fatal error C1075: end of file found before the left brace '{' at

出现 C:\Users\acer\Downloads\Cpp2.cpp(591) : fatal error C1075: end of file found before the left brace { at C:\Users\acer\Downloads\Cpp2.cpp(357) was matched 执行 cl.exe 时出错. 谁知道怎么求改&#xff1f;&#xff1f; 答&#xff1a; 程序中 {} 不是成对出现…

Cloud Foundry Java客户端–流事件

Cloud Foundry Java客户端提供了基于Java的绑定&#xff0c;用于与正在运行的Cloud Foundry实例进行交互。 这个项目的优点之一是它采用了基于Reactive Stream的API作为方法签名&#xff0c;特别是使用Reactor实现&#xff0c;这在使用流数据时特别有用。 在这篇文章中&#x…

vue导入html登陆页,Vue 实现 登陆后打开主页面(登陆组件 + 主页面组件)

本次演示&#xff0c;项目所需iview&#xff0c;router首先在 views 目录 新建 两个 组件 ( login.vue &#xff0c;index.vue )login.vue登录登 录export default {methods: {login() {// 假设登陆成功&#xff0c;则跳转到 index 组件this.$router.replace(/index);}}}backgr…

设置窗口大小

window.resizeTo(screen.availWidth, screen.availHeight);转载于:https://www.cnblogs.com/7q4w1e/p/9680037.html

android IO流_Flutter实战经验(十):打包和发布到 Android 平台

本文适合ios开发者不清楚Android上架机制学习。在一般的开发过程中&#xff0c;我们可以使用 flutter run 命令&#xff0c;或者 IntelliJ 工具栏中的 Run 和 Debug 来测试 app。这时候&#xff0c;Flutter 默认会为我们构建 app 的调试版本。当想要发布 app 时&#xff0c;比如…

西安单招学校学计算机软件的,西北大学软件职业技术学院单招

西北大学肇始于1902年的陕西大学堂和京师大学堂速成科仕学馆&#xff0c;1912年始称西北大学&#xff0c;1978年被确定为全国重点大学。现为国家“211工程”建设院校、教育部与陕西省共建高校。在长期的办学历程中&#xff0c;西北大学形成了“发扬民族精神&#xff0c;融合世界…

autojs遍历当前页面所有控件_PyQT5控件:容器(Containers Widgets)

QWidget主窗体容器 在Qt设计师中新建文件&#xff0c;选择QWidget QWidget属性 enabled 窗口部件是否有效geometry 窗口部件相对于其父窗口的几何图形&#xff0c;并排除窗口框架sizePolicy 窗口部件的默认布局行为minimumSize 窗口部部件的最小尺寸&#xff08;以像素为单位&a…

JAVA 技术类分享(一)

一、dubbo dubbo原理模型&#xff1f; 主要是注册中心&#xff0c;服务提供者&#xff0c;服务消费者&#xff0c;监控中心&#xff0c;其中后者可有可无。1.服务端&#xff0c;在注册中心注册自己提供的服务&#xff0c;并暴露端口&#xff0c;2.客户端在注册中心注册&#xf…

计算机的就业指导论文,计算机就业指导期刊文章参考文献 计算机就业指导专著类参考文献有哪些...

为论文写作提供【100个】计算机就业指导期刊文章参考文献,海量计算机就业指导相关论文参考文献,包括期刊,专著,外文参考文献,解决您的计算机就业指导专著类参考文献有哪些的相关难题&#xff01;一、计算机就业指导论文参考文献范文[1]“基于就业岗位需求”的专业课程体系建设的…

junit rule_使用JUnit的ExpectedException和@Rule测试自定义异常

junit rule异常测试 为什么要测试异常流&#xff1f; 就像所有代码一样&#xff0c;测试覆盖率在代码和应该产生的业务功能之间写了一个合同&#xff0c;从而为您提供了代码的有效文档 &#xff0c;以及可以尽早且经常强调功能的附加功能。 我不会介绍测试的许多好处&#xff0…

经纬度1秒约等于多少米?

WGS84坐标系统下&#xff08;通常我们采用的GPS内的坐标系统&#xff09; 如果是中国常用的WGS1984的经纬度坐标&#xff0c;1秒相当于33米。具体如下&#xff1a; 经度1度85.39km 经度1分 1.42km 经度1秒 23.6m 纬度1度 大约111km 纬度1分 大约1.85km 纬度1秒 大约30.9m

学计算机单招可以报那几个公立学校,为什么要选择公办单招学校,四川公办单招学校有哪些?...

高职单招单招被称为春季高考&#xff0c;在四川参加单招考试的学生逐年上升&#xff0c;周时参加单招的高职院校也越来越多。但是单招不像是高考可以通过不同的志愿&#xff0c;来填报多所学校。单招只能选择某一个学校&#xff0c;一旦确定就不能更改。这样的结果就是选择学校…

AutoValue:生成的不可变值类

Google GitHub托管的项目AutoValue之所以有趣&#xff0c;有多种原因。 该项目不仅使为“ 值对象 ”编写更少的Java代码变得容易&#xff0c;而且还为Java注释处理的实际应用提供了概念上简单的演示。 该自动/值项目是由提供谷歌的员工凯文Bourrillion和埃蒙麦克马纳斯和许可与…

exit(0)与exit(1)、return区别

exit&#xff08;0&#xff09;&#xff1a;正常运行程序并退出程序&#xff1b; exit&#xff08;1&#xff09;&#xff1a;非正常运行导致退出程序&#xff1b; return&#xff08;&#xff09;&#xff1a;返回函数&#xff0c;若在主函数中&#xff0c;则会退出函数并返回…

上海教师计算机等级要求,计算机考试阅卷教师谈等级考试

等级考试笔试是由选择题和填空题两大部分组成。选择题是由阅卷系统改卷&#xff0c;而填空题是由阅卷教师评阅&#xff0c;下面我们就从分析阅卷的得分丢分情况来谈谈如何让阅卷教师在公平、公正的前提下尽可能的给予"高分"&#xff0c;让考生尽量避免不必要的"…

C++读取文本文件中以TAB作为分隔符,且中间字段有为空的情况的方法?

数据文件&#xff1a;testData.txt 内容&#xff1a; 111 222 444 555思路&#xff1a; getline()将testData.txt中的第一行记录读入到一个string中&#xff0c;然后搜索第n个分隔符进行定位&#xff0c;判断第n个字段长度&#xff0c;使用substr&#x…

宿迁学计算机的学校,宿迁计算机学校

01、宿迁计算机学校培养目标培养学生具有基本的审美能力&#xff0c;利用常用的平面设计软件进行多媒体产品开发、广告设计与创意、印刷品的设计、展览展示等能力&#xff0c;能够从事多媒体产品开发&#xff0c;广告设计与创意&#xff0c;印刷品的设计&#xff0c;展览展示等…