R*树是R树的一种变体,可用来建立索引空间信息(英语:Spatial database)。R*树的构造花费比标准R树略高。例如数据可能需要被重新插入,但这通常能获得更好的查询性能。像标准R树一样,它能存储点和空间数据。它在1990年由Norbert Beckmann,Hans-Peter Kriegel,Ralf Schneider,和Bernhard Seeger提出。[1]

目录

1 R*树和R树的不同

2 性能

3 算法和复杂性

4 参考资料

5 外部链接

R*树和R树的不同

由反复插入构建的R*树 (in ELKI)。 这颗树的重叠较少,因此有很好的查询性能。 红的和蓝的MBRs是索引页,绿的MBRs是叶节点。

coverage和重叠的最小化对于R树的性能至关重要。重叠意味着,对于数据查询和插入,多于一个的树分支需要被扩展(由于这个方法数据将被分裂到许多可能重叠的区域)。 一个最小化的 coverage 改进修剪性能,经常允许从搜索排除 所有页面,特别是负值范围的查询。

在节点溢出时,R*树尝试减少 both, using a combination of a revised 节点分裂算法和强制重插的概念。 这基于观察 that R树结构 are highly susceptible

to the order in which their entries are inserted, so an insertion-built (rather than bulk-loaded) structure

is likely to be sub-optimal. entries的删除和重插允许他们在树中“找”到一个比原来更适合的位置。

当一个节点溢出,它的一部分entries会被移除并重新插入到树。

(为了避免被随后的节点溢出引起 an indefinite cascade of 重插,重插例程可能只被调用一次 in 树的每一级 when 插入任一新的entry。) This has the

effect of producing more well-clustered groups of entries in nodes, 减少节点coverage。 此外,

actual node splits are often postponed, causing average node occupancy to rise.

重插能被看作增长树的一种优化方法, 它在节点溢出时被触发。

性能

Improved split heuristic produces pages that are more rectangular and thus better for 许多应用。

重插方法优化已经存在的树,但增加了复杂性。

同时高效地支持点和空间数据。

在德国邮区数据库上不同分裂尝试的效果

R树,采用Guttman二次分裂方式。[2]

有很多从东延伸到西的页,它们跨越整个德国,并且页重叠很多。这无益于那些经常只需要一个很小矩形和许多条形区域相交的大多数应用。

R树,采用Ang-Tan线性分裂分裂。[3]

尽管条形区域的延伸不像Guttman分裂那样远,条形切割的问题影响几乎每一个叶页。叶页重叠很少,但目录页重叠却很多。

R*树拓扑分裂。[1]

由于R*树尝试最小化页重叠,使得页重叠非常少,并且重插进一步优化此树,分裂策略亦尽量避免产生条形区域,因而结果页对于通常的地图应用有用得多。

算法和复杂性

R*树的查询和删除操作使用和正规R树一样的算法。

插入时,R*树使用一种组合策略。对于叶节点,重叠被最小化,而对于内节点,则enlargement和area被最小化。

分裂时,R*树使用一种拓扑分裂,其选择一条基于perimeter的分裂轴,然后最小化重叠。

除改良的分裂策略外,R*树也尝试通过重插对象和子树来避免分裂,灵感来自平衡一颗B树的概念。

显然,最坏情况下R*树的查询和删除复杂度与R树相当。R*树的插入策略具有O

(

M

log

M

)

{displaystyle {mathcal {O}}(Mlog M)}的复杂度,它比R树线性分裂策略的复杂度高(O

(

M

)

{displaystyle {mathcal {O}}(M)}),但比R树取页大小为M

{displaystyle M}时的二次分裂策略(O

(

M

2

)

{displaystyle {mathcal {O}}(M^{2})})复杂度低,并且对总复杂度没有太大的影响。R*树总的插入复杂性仍与R树相当。重插至多影响一个树支,因此重插操作具有O

(

log

n

)

{displaystyle {mathcal {O}}(log n)}的复杂度,这与正规R树的分裂操作相当。总体而言,R*树的复杂度与正规R树处于同一数量级。

一个完整的算法实现必须考虑诸多未在此处涉及的边角案例与特殊情况。

参考资料

^ 1.0 1.1 Beckmann, N.; Kriegel, H. P.; Schneider, R.; Seeger, B. Proceedings of the 1990 ACM SIGMOD international conference on Management of data - SIGMOD '90 (PDF): 322. 1990. ISBN 0897913655. doi:10.1145/93597.98741. |chapter=被忽略 (帮助)

^ Antonin Guttman, Antonin Guttman. R-trees: a dynamic index structure for spatial searching, R-trees: a dynamic index structure for spatial searching. ACM SIGMOD Record. 1984-06-18, 14 (2): 47, 47–57, 57 [2018-04-02]. ISSN 0163-5808. doi:10.1145/602259.602266.

^ C. H. Ang, T. C. Tan. New linear node splitting algorithm for R-trees. Springer, Berlin, Heidelberg: 337–349. 1997-07-15 [2018-04-02]. ISBN 3540632387. doi:10.1007/3-540-63238-7_38 (英语).

外部链接

包含R*树的库:

Boost.Geometry rtree documentation (C++, maybe R-tree only)

ELKI R*-tree package documentation (Java)

Spatial Index Library (C++)

SQLite R*-tree module (C)

TPIE Library (C++)

XXL Library (Java, maybe R-tree only)

示例代码:

A header-only C++ R* Tree Implementation (probably buggy and it does not generate a R*-tree, but a freely defined (by the code author) variation of the original definition)

A 2D R*-tree implementation (C/C++)

R-tree Demo Applet (requires Java)

mysql的R树_R*树相关推荐

  1. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

  2. 为什么MySQL数据库要用B+树存储索引?

    小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 话说两个多月前,小史通过了A厂的一面,两个多月后的今天,小史终于等到了A厂的二面. 简单 ...

  3. mysql存储base64位用什么类型_【漫画】面试现场:为什么MySQL数据库要用B+树存储索引?...

    推荐阅读:MySQL最全整理(面试题+笔记+导图),面试大厂不再被MySql难倒! 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 话说 ...

  4. mysql里b树_MySQL-B树/B+树

    B树(B-树) B树又称平衡多路二叉树 发现需要3次磁盘I/O操作,和3次内存查找操作.由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率.而3次磁盘I/O操作是影响整个B-Tree查找效 ...

  5. 为什么MySQL数据库要用B+树存储索引

    A:为什么MySQL数据库要用B+树存储索引? Hash的查找速度为O(1),而树的查找速度为O(log2n),为什么不用Hash作为数据库的存储索引呢? 树的话,无非就是前中后序遍历.二叉树.二叉搜 ...

  6. 漫画 | 为什么 MySQL 数据库要用 B+ 树存储索引?

    作者 |  channingbreeze 责编 | 郭芮 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 话说两个多月前,小史通过了A厂 ...

  7. 16kb等于多少b_面试官:MySQL索引为何选择B+树?

    声明 本文所述的各种数据结构(二叉树等),均不考虑重复值的情况,本文简述各种数据结构的区别仅仅只是为了理解MySQL索引的需要而做的铺垫. 什么是索引 提起索引,大家都知道,建立索引可以让数据库查询更 ...

  8. mysql为什么要用b+树

    mysql为什么要用b+树 先看原因: 1.B+树减少了IO次数,效率更高 (这里这么理解:-----就是减少了磁盘的访问次数,毕竟内存速度要比磁盘快的多) 2.B+树查询跟稳定,因为所有数据放在叶子 ...

  9. b-tree和b+tree以及mysql为什么使用了b+树

    最近写了一些mysql的博客,但是对于索引的数据结构一致没有深入的描述过.所以就有了这一篇文章. b tree和b-tree就是一个玩意 应该很多人都看到过b树和b-树,还有b+树,不了解的小伙伴还以 ...

  10. 【mysql innodb索引结构B+树】

    [mysql innodb索引结构B+树] 为什么Mysql中Innodb的索引结构采取B+树? B树 B树的两个明显特点 树内的每个节点都存储数据 叶子节点之间无指针相邻 B+树 B+树的两个明显特 ...

最新文章

  1. 用Flutter + Dart快速构建一款绝美移动App
  2. 自编码器及相关变种算法简介
  3. ITK:添加点和边到网格
  4. 有关python方面的论文_一篇文章可以带你理解python中的类
  5. 数制转换itoa atoi int转字符串 字符串转int string转int int转string
  6. MySQL函数/数据库函数
  7. python实现路由功能_python 实现重启路由器
  8. 网站留言板防重复留言_2020微信公众号怎么开通原创、赞赏、留言功能?【5月更新】...
  9. oracle建表6大约束,oracle 建表 约束 constraint
  10. 量化投资的现状和前景
  11. 开源代码和框架专栏汇总
  12. 金融学习之四——插值法求远期国债收益率
  13. 项目计划表格甘特图_甘特图VARCHART XGantt功能模块详细解析!
  14. timeline java_Java Timeline.stop方法代码示例
  15. 旅游行业APP开发方案
  16. 防止表单重复提交的问题
  17. CxImage学习使用1:环境搭建
  18. 8.25 欢乐emmm赛
  19. 完全平方数:若一个整数n能表示成某个整数m的平方的形式,则称这个数为完全平方数。写一个程序判断输入的整数是不是完全平方数。
  20. varchar(50)中50的涵义

热门文章

  1. photoshop标尺工具_工具设置:PhotoShop
  2. mui+vue文件上传(图片)
  3. ROS与PCL:在setconditionfunciton时,无法使用std::bind
  4. PC端答题小助手软件 – 用 OCR 高效完成在线答题
  5. Spring Bean生命周期,好像人的一生。。
  6. python jsonrpc_python-jsonrpc框架实现JsonRPC协议的web服务
  7. 手把手教你在 SpringBoot 自定义参数解析器
  8. spring 定时器功能
  9. pip install numpy 安装numpy失败
  10. 实现Modbus Rtu 服务端 通过RS485转4G方式 实现远程采集传输串口设备数据