数据结构笔记:R树

news2024/11/18 7:50:39

R-trees: a dynamic index structure for spatial searching 1984

1 介绍

  • R树可以看作B树再高维空间的扩展。它很好的解决了在高维空间搜索等问题。
    • 采用了B树分割空间的思想,并在添加、删除操作时采用合并、分解结点的方法,保证树的平衡性
    • R树就是一棵用来存储高维数据的平衡树

2 R树数据结构

  • R树采用了一种称为MBR(Minimal Bounding Rectangle,最小边界矩形)的方法,来分割空间
    • 从叶子结点开始用矩形(rectangle)将空间框起来,结点越往上,框住的空间就越大,以此对空间进行分割
    • R树的每个结点不存放空间要素的值。叶结点中存储该结点对应的空间要素的外包络矩形和空间要素标识

  • 首先假设所有数据都是二维空间下的点,图中仅仅标志了R8区域中的数据,也就是那个shape of data object
  • 为了实现R树结构,用一个最小边界矩形恰好框住这个不规则区域
    • 这样就构造出了一个区域:R8
    • 其他实线包围住的区域,如R9,R10,R12等都是同样的道理
      • 一共得到了12个最最基本的最小矩形。这些矩形都将被存储在子结点中
  • 下一步操作就是进行高一层次的处理。我们发现R8,R9,R10三个矩形距离最为靠近,因此就可以用一个更大的矩形R3恰好框住这3个矩形
    • 同样道理,R15,R16被R6恰好框住,R11,R12被R4恰好框住
    • 所有最基本的最小边界矩形被框入更大的矩形中之后
  • 再次迭代,用更大的框去框住这些矩形
  • 根据R树的这种数据结构,当我们需要进行一个高维空间查询时,我们只需要遍历少数几个叶子结点所包含的指针,查看这些指针指向的数据是否满足要求即可。
    • ——>这种方式使我们不必遍历所有数据即可获得答案,效率显著提高

3 R树的查找

4 R树性质

  • 除非它是根结点之外,所有叶子结点包含有m至M个记录索引(条目)。

    • 作为根结点的叶子结点所具有的记录个数可以少于m。通常,m=M/2。

  • 每一个非叶子结点拥有m至M个孩子结点,除非它是根结点

  • 所有叶子结点都位于同一层,因此R树为平衡树

5 叶子节点的结构

  • 叶子结点所保存的数据形式为:(I, tuple-identifier)
    • tuple-identifier表示的是一个存放于数据库中的tuple,也就是一条记录,它是n维的。
    • I是一个n维空间的矩形,并可以恰好框住这个叶子结点中所有记录代表的n维空间中的点。
      • I=(I0,I1,…,In-1)
    • I所代表的就是图中的矩形
    • 有两个tuple-identifier,在图中即表示为那两个点

5 非叶子节点的结构

  • R树的非叶子结点存放的数据结构为:(I, child-pointer)
    • child-pointer是指向孩子结点的指针
    • I是覆盖所有孩子结点对应矩形的矩形

6 R树的插入

6.1 有足够的空间插入

  • 由于插入的x所在的区域P2的数据条目仍然有足够的空间容纳条目x,且x的区域面积即MBR也位于区域P2之内
  • 所以这种情况下,我们认为x拥有足够的插入空间。

6.2 增大MBR

由于插入的y所在的区域P2的数据条目仍然有足够的空间容纳条目y,但是y的区域面积即MBR并不完全位于P2的区域之内,因此我们在插入数据y后会导致P2区域的相应扩大

6.3 需要进行分裂的插入

  • 由于插入的w所在的区域P1的数据条目已经没有足够的空间容纳条目w,因为假设我们定义R树的阶m=4,而区域P1已经容纳了四个条目「A,B,C,K」了,插入w后孩子数为5,已经超过m=4了
  • 所以要进行分类操作,来保证树的平衡性

  • 采用分裂算法对结点(区域)P2进行合理地分裂
    • 使其分裂成P1(包含A,B)和P5(包含k,w)两个结点
  • 由于分裂之后原来根结点「P1,P2,P3,P4」变成了「P1,P2,P3,P,P5」,因此根结点的孩子数由4变成5,超过了阶数m=4.
    • 所以根结点也要进行分裂,分裂成Q1(包含P1,P5,P2)和Q2(包含P3,P4)两个结点
  • 由于此时分裂已经传递到根结点,所以生成新的根结点记录Q1,Q2。

7 分裂

7.1 挑选seed

  • 对于所有条目中的每一对E1和E2,计算可以包裹着E1,E2的最小限定框J=MBR(E1, E2) ,
    • 然后计算增量d= J-E1-E2.
      • 从 J 的面积中减去E1 和 E2 的面积,以找到包含两者所需的额外空间。
      • 这个增量 d 反映了将E1 和E2 放在同一个边界矩形中所需的“额外”空间。
    • 计算结束后选择d最大的一对(即增量最大)
      • 选择增量 d 最大的一对条目的原因是,这样可以保证分裂后,生成的两个分组之间的重叠区域最小

7.2 分类条目分组

  • 挑选出seed1和seed2后,就将剩下的要分配的分裂条目分给这两个seed使它们各称为一个组
    • 这个分配的原则就是离谁比较“近”就和谁一组
      • 近指的是,对于条目E,分别计算可以包裹着E和seed1的最小限定框J1=MBR(E,seed1), 可以包裹着E和seed2的最小限定框J2=MBR(E,seed2)
      • 再分别计算增量d1=J1-E-seed1,d2=J2-E-seed2。d1,d2哪个小就说明哪个“近”

8 删除

  • B树删除过程中,如果出现结点的记录数少于半满(即下溢)的情况,则直接把这些记录与其他叶子的记录“融合”(两个相邻结点合并)
  • R树却是直接重新插入

举例:

以下是原始的空间分割和R-tree

 现在删除一个绿色的区域

 此时对应的MBR中只有一条记录,不满足R树性质,发生下溢,将另一个绿色的区域放入链表中

 放入链表后,上层MBR也只有一条记录,所以也放入链表中

 分别进行插入操作(也是一样,先找到矩形应该插入的位置,然后判断是否需要分裂)

参考内容:什么是R树? - 知乎 (zhihu.com)

空间数据索引RTree(R树)完全解析及Java实现 - 佳佳牛 - 博客园 (cnblogs.com)

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

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

相关文章

Nginx配置开启HTTPS

获取证书文件 Nginx 开启SSL server {listen 443 default ssl;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;proxy_set_header Host $host;ssl_certificate /usr/local/nginx/cert/server.pem;ssl_certificate_key /usr/local/ngin…

Sealos 云操作系统一键集成 runwasi,解锁 Wasm 的无限潜力

WebAssembly (通常缩写为 Wasm) 是一种为网络浏览器设计的低级编程语言。它旨在提供一种比传统的 JavaScript 更快、更高效的方式来执行代码,以弥补 JavaScript 在性能方面的不足。通过使用二进制格式,WebAssembly 能够提供比传统 JavaScript 更快的解析…

印刷企业使用数字工厂管理系统前后有什么变化

随着科技的飞速发展,数字工厂管理系统已经逐渐渗透到印刷企业的各个环节。本文将通过分析印刷企业在使用数字工厂管理系统前后的变化,探讨这一技术如何为印刷行业带来革新。 一、使用前的状况 在使用数字工厂管理系统之前,印刷企业的生产方式…

从理论到实践:深度解读BIO、NIO、AIO的优缺点及使用场景

文章目录 BIO优缺点示例代码 NIO优缺点示例代码 AIO优缺点示例代码 总结 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 BIO、NIO和AIO是Java编程语言中用于处理输入输出(IO…

一则DNS被重定向导致无法获取MySQL连接处理

同事反馈xwik应用端报java exception 获取MySQL连接超时无法连接到数据库实例 经过告警日志发现访问进来的IP地址数据库端无法被解析,这里可以知道问题出现在Dns配置上了 通过以上报错检查/etc/resolve.conf 发现namesever 被重定向设置成了114.114.114.114 域名 …

Java面试题(每天10题)-------连载(31)

多线程篇 注:今天只更新四题,明天就换别的了 1、concurrent包下有哪些类? ConcurrentHashMap、Future、FutureTask、AtomicInteger... 2、线程a、b、c、d运行任务,怎么保证当a、b、c线程执行完再执行d线程? 1 、 Cou…

AdaBoost:提升机器学习的力量

一、介绍 机器学习已成为现代技术的基石,为从推荐系统到自动驾驶汽车的一切提供动力。在众多机器学习算法中,AdaBoost(Adaptive Boosting的缩写)作为一种强大的集成方法脱颖而出,为该领域的成功做出了重大贡献。AdaBoo…

企业设备巡检的痛点和解决方案

在设备巡检过程中,企业常面临多种痛点。首先,信息管理不足是一个关键问题,企业往往缺乏全面、准确的设备信息记录,这导致巡检工作缺乏针对性和效率。其次,巡检流程的非标准化使得巡检结果出现不一致,重要的…

HTML5+CSS3小实例:炫酷的流边按钮

实例:炫酷的流边按钮 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content="wid…

妙手ERP本期功能优化:TikTok创建折扣活动可默认生成活动名称和时间、Shopee利润明细新增字段等

为了给卖家朋友带来更好的使用体验&#xff0c;更高效地运营跨境店铺&#xff0c;妙手ERP在上周优化了以下多项功能。 01、产品模块优化 全平台 - 批量编辑平台SKU增加翻译功能 TikTok - 创建折扣活动时&#xff0c;可默认生成活动名称和时间 02、订单模块优化 全平台 - 扫…

CleanMyMac X“断网激活”真的可以吗?

CleanMyMac X帮助Mac系统进行垃圾清理&#xff0c;清除多余的缓存、应用程序等&#xff0c;在提高工作效率上起了很大的作用。但是随着对软件的需求不断增加&#xff0c;很多人开始研究通过捷径破解正版软件&#xff0c;但是是否能成功呢&#xff1f;今天小编就为大家揭开“断网…

哪些方面的应用适合博捷芯双轴半自动划片机?

博捷芯BJX3666系列双轴半自动划片机可以应用于以下领域&#xff1a; 1. 集成电路制造&#xff1a;在集成电路制造中&#xff0c;划片机可以用来将芯片从晶圆上切割下来&#xff0c;以便进行封装和测试。此外&#xff0c;还可以用来对芯片进行划片分离加工&#xff0c;以得到所需…

格式工厂——万能格式转换器

很多时候&#xff0c;大家从网络上下载的文件不一定是自己想要的类型&#xff0c;比如flv等视频文件&#xff0c;而强行改文件后缀名只会造成文件格式错误&#xff0c;无法打开&#xff1b;而很多文件的格式并不能轻易转换&#xff0c;且很多渠道都需要收费。今天介绍的这款For…

【linux】centos7 yum安装nginx

查看系统中是否已安装 nginx 服务 yum list | grep nginx查看nginx运行进程 ps -ef | grep nginx添加源 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 安装Nginx yum install -y nginx 查看nginx安装目录 find …

【23真题】懒得出题!连续两年试卷相同!

连续两年出题一样&#xff0c;老师都懒得出题的院校又被我抓到一所&#xff01;&#xff08;上次是天津工业22和21年一模一样&#xff09;&#xff0c;这次沈阳工业的老师多多少少改了几个数&#xff0c;但是也大差不差&#xff0c;考这所院校&#xff0c;猛刷真题&#xff0c;…

Elasticsearch的配置学习笔记

文/朱季谦 Elasticsearch是一个基于Lucene的搜索服务器。它提供一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口&#xff0c;Elasticsearch是用Java语言开发的。 关于Elasticsearch系列笔记&#xff0c;主要从Elasticsearch的配置、核心组件、架构设计、使…

黔院长 | 《黄帝内经》——气厥论!

当我们体内的寒热之气厥逆&#xff0c;也就是气息上逆犯冲&#xff0c;就会为患多端&#xff0c;导致寒热之气在体内不断传变&#xff0c;我们的五脏六腑也跟着产生疾病。 肾得寒气&#xff0c;传给脾气&#xff0c;脾无法将水谷之精输养全身&#xff0c;就会导致人言语无力&a…

高德地图系列(四):vue项目利用高德地图实现车辆的路线规划

目录 第一章 效果图 第二章 源代码 第一章 效果图 小编该案例主要实现的两个点的思路&#xff1a;1、有两个正常的经纬度就可以在地图中绘制出汽车从起点到终点的路线规划&#xff1b;2、当用户经纬度发生变化时&#xff0c;用户可以通过某个操作&#xff0c;或者程序员通过…

VS2017新建.hpp文件

目录 1、新建h文件的方法&#xff1a;2、新建对用的cpp文件&#xff1a;3、在main.cpp中调用 1、新建h文件的方法&#xff1a; 2、新建对用的cpp文件&#xff1a; 3、在main.cpp中调用 参见大佬博客