当前位置:首页 > 科技  > 软件

图形遍历效率低?试试 R 树

来源: 责编: 时间:2024-01-10 09:34:59 281观看
导读大家好,我是前端西瓜哥。今天我们来看看 R 树是什么?以及它为什么能够提高图形的检索速度。R 树(R-tree)是一种 空间索引技术,能够是从大量的节点中,快速找到特定范围的元素集合,而不用一个不落地遍历所有节点。思路和其他索

9ya28资讯网——每日最新资讯28at.com

大家好,我是前端西瓜哥。9ya28资讯网——每日最新资讯28at.com

今天我们来看看 R 树是什么?以及它为什么能够提高图形的检索速度。9ya28资讯网——每日最新资讯28at.com

R 树(R-tree)是一种 空间索引技术,能够是从大量的节点中,快速找到特定范围的元素集合,而不用一个不落地遍历所有节点。9ya28资讯网——每日最新资讯28at.com

思路和其他索引算法(比如 B 树、跳表)有点像,但 R 树针对的是高维数据的查询 。R 树的 “R” 指的是矩形(Rectangle)。9ya28资讯网——每日最新资讯28at.com

举个具体的例子,假设有一张地图,上面有几百万个节点,要快速找某个位置半径 2 公里的所有餐馆的信息。9ya28资讯网——每日最新资讯28at.com

低效的做法是遍历这几百万的节点的位置,判断距离是否小于 2 公里。9ya28资讯网——每日最新资讯28at.com

但如果用上索引技术,比如 R 树,我们就能利用索引去 空间换时间,快速拿到特定范围的节点超集,比如几千个。9ya28资讯网——每日最新资讯28at.com

接着只需要遍历这几千个节点去判断符合条件的节点就可以了,而不需要完完整整遍历所有的节点。9ya28资讯网——每日最新资讯28at.com

除此之外还可以:9ya28资讯网——每日最新资讯28at.com

  • 快速检索平面中和选区矩形相交的二维图形;
  • 在数据库中快速找出多维度的产品,比如价格、库存、过期时间在特定范围的商品。

R 树的数据结构

下面看一下在图形编辑器的一个场景。9ya28资讯网——每日最新资讯28at.com

我们构建了一棵图形树,图形树的图形有位置、宽高等属性,并渲染在画布上。9ya28资讯网——每日最新资讯28at.com

需要实现选择功能,绘制一个矩形选区,使和该选区矩形相交的图形高亮。9ya28资讯网——每日最新资讯28at.com

9ya28资讯网——每日最新资讯28at.com

为实现这个能力,我们计算图形树上的每个图形的包围盒:一个用 minX,minY、maxX、maxY 表达的一个矩形,它刚好包围住图形。9ya28资讯网——每日最新资讯28at.com

包围盒的作用是简化碰撞算法,一些复杂的图形,比如贝塞尔曲线,如果要严格意义上判断碰撞,是要进行复杂的计算的,在有大量图形的场景下,性能非常糟糕。9ya28资讯网——每日最新资讯28at.com

所以业内常用矩形包围盒的碰撞来简化,这种算法非常简单高效,可直接用来替代原本复杂精细的碰撞检测,或是在进行复杂碰撞算法前先做一层过滤,避免无谓的复杂运算。9ya28资讯网——每日最新资讯28at.com

// 矩形是否相交function intersects(a, b) {  return b.minX <= a.maxX &&         b.minY <= a.maxY &&         b.maxX >= a.minX &&         b.maxY >= a.minY;}

这个包围盒特点,就很适合拿来应用 R 树来提高图形树的 检索效率。9ya28资讯网——每日最新资讯28at.com

R 树的数据结构是一个平衡树。9ya28资讯网——每日最新资讯28at.com

和其他索引树类似,R 树的叶子节点是数据节点,保存有图形信息和它的最小包围矩形(MBR)。9ya28资讯网——每日最新资讯28at.com

最小包围矩形其实就是包围盒。9ya28资讯网——每日最新资讯28at.com

结构大概类似这样:9ya28资讯网——每日最新资讯28at.com

{  minX: 20,  minY: 40,  maxX: 30,  maxY: 50,  // 保存图形数据,比如图形对象 id,或图形对象本身  data: {}};

R 树会将距离相近的数据节点收集起来,并放到同一个父节点下。这个父节点是 索引节点,不会保存图形信息,但会记录子节点的合并的包围盒数据。9ya28资讯网——每日最新资讯28at.com

父节点如果多了,也会把它们收集起来,放到一个新的父节点下。9ya28资讯网——每日最新资讯28at.com

这样就形成了一个树的结构。9ya28资讯网——每日最新资讯28at.com

9ya28资讯网——每日最新资讯28at.com

实际生产环境,推荐使用一个名为 RBush 的高性能 NPM 库。9ya28资讯网——每日最新资讯28at.com

代码用法示例:9ya28资讯网——每日最新资讯28at.com

import RBush from "rbush";// 创建一个 R 树实例const tree = new RBush();// 也可以指定一个索引节点最多有几个子节点,默认是 9 个const tree2 = new RBush(16);

R 树的检索

检索的过程如下:9ya28资讯网——每日最新资讯28at.com

提供一个选区矩形,从根节点开始,往下递归查找判断选取矩形是否和当前节点矩形相交。9ya28资讯网——每日最新资讯28at.com

  • 若不相交,其下的节点也不会相交,该节点对应的子树就不需要继续递归了。
  • 若相交且为数据节点(叶子节点),将其放到 result 数组。
  • 若是包含关系,其下的所有数据节点放到 result 数组。
  • 若相交但并不包含,则遍历其下的子节点,重复前面的操作。

直到可能相交的节点遍历完结束,然后返回 result 数组。9ya28资讯网——每日最新资讯28at.com

RBush 的搜索写法:9ya28资讯网——每日最新资讯28at.com

const result = tree.search({  minX: 20,  minY: 20,  maxX: 80,  maxY: 70,});

其源码实现:9ya28资讯网——每日最新资讯28at.com

class RBush {  // ...  search(bbox) {    let node = this.data;    const result = [];    if (!intersects(bbox, node)) return result;    const toBBox = this.toBBox;    const nodesToSearch = [];    while (node) {      for (let i = 0; i < node.children.length; i++) {        const child = node.children[i];        const childBBox = node.leaf ? toBBox(child) : child;        if (intersects(bbox, childBBox)) {          // 1. 遍历到数据节点          if (node.leaf) result.push(child);          // 2. 索引节点          // 2.1. 包含关系,索引节点下的所有数据节点都加进 result          else if (contains(bbox, childBBox)) this._all(child, result);          // 2.2. 相交不包含关系,继续判断相交          else nodesToSearch.push(child);        }      }      node = nodesToSearch.pop();    }    return result;  }    _all(node, result) {    const nodesToSearch = [];    while (node) {      if (node.leaf) result.push(...node.children);      else nodesToSearch.push(...node.children);      node = nodesToSearch.pop();    }    return result;  }}

R 树的更新

1、初始化

在图形编辑器初始化的时候,我们要计算图形树所有图形的包围盒,然后插入到 R 树上。9ya28资讯网——每日最新资讯28at.com

RBush 插入单个节点的写法:9ya28资讯网——每日最新资讯28at.com

const item = {  minX: 20,  minY: 40,  maxX: 30,  maxY: 50,  graphId: '123',};tree.insert(item);

支持批量插入节点,RBush 针对批量添加做了优化,效率比单个插入更高。9ya28资讯网——每日最新资讯28at.com

tree.load([item1, item2, /* ... */]);

2、更新

R 数作为索引数据,是要实时更新。9ya28资讯网——每日最新资讯28at.com

为此,我们需在每次图形物理属性改变的时候,重新计算包围盒,并更新 R 树。9ya28资讯网——每日最新资讯28at.com

tree.remove(item);tree.insert(newItem);

四叉树(Quadtree)

还有一种同样可以减少遍历节点数量的算法,叫做 四叉树(Quadtree)碰撞检测。9ya28资讯网——每日最新资讯28at.com

四叉树将视口界面分割成多个区域,每个区域记住自己包含了哪些图形。9ya28资讯网——每日最新资讯28at.com

然后移动目标图形时,判断它落在哪个区域,取出所在区域的图形,这些图形集合就是和目标图形发生碰撞图形的超集。9ya28资讯网——每日最新资讯28at.com

当一个区域的图形数量过多时,又会进行分裂,再次分成 4 个区域。9ya28资讯网——每日最新资讯28at.com

9ya28资讯网——每日最新资讯28at.com

四叉树更适合图形均匀分布的场景,如果不均匀,会产生大量空节点,且查询效率会降低。9ya28资讯网——每日最新资讯28at.com

R 树除了处理二维,还可以处理更高维度的数据,相比四叉树更适合范围查询。9ya28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-59641-0.html图形遍历效率低?试试 R 树

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 别再找了,关于延时关闭订单,这里有10种方案~

下一篇: 教你如何使用 eval 函数解析和执行字符串代码,让你的程序更加智能!

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,&ldquo;7
Top