【Algorithms 4】算法(第4版)学习笔记 13 - 番外篇:二叉查找树的几何应用(下篇)

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 4:区间搜索树(interval search trees)
      • 4.1:一维区间搜索
      • 4.2:区间搜索树定义
      • 4.3:区间搜索树 demo 演示
      • 4.3.1:插入
      • 4.3.2:搜索命中
      • 4.3.3:搜索未命中
      • 4.3.4:搜索代码实现
      • 4.3.5:搜索分析
      • 4.4:区间搜索树分析
      • 5:矩形交集问题(rectangle intersection)
      • 5.1:微处理器与几何
      • 5.2:算法与摩尔定律
      • 5.3:矩形相交查询:扫描线算法
      • 5.4:扫描线算法分析
      • 6:总结:BST 的几何应用

前言

本篇内容属于《算法》视频的番外篇,是关于前面几篇所学内容 BST 的扩展应用,因此在学习本篇之前,请先学习或回顾一下前面几篇的内容:《3.1 符号表》、《3.2 二叉查找树》、《3.3 平衡查找树》。

温馨提示:如果不知道 BST 是什么的朋友强烈建议先看看前面几个章节的内容。: )

由于本章节的内容很多,所以分成了上下两篇,本篇主要内容包括:区间搜索树矩形交集问题

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
  • 官方网站

学习笔记

注 1:所有 demo 演示均为视频 PPT demo 截图。
注 2:如果 PPT 截图中没有翻译,会在下面进行汉化翻译,因为内容比较多,本文不再一一说明。
注 3:由于以下内容是连接上篇的,所以目录也是连贯的,不从 1 开始。

4:区间搜索树(interval search trees)

4.1:一维区间搜索

在这里插入图片描述

一维区间搜索。数据结构用于存储一组(可能重叠的)区间。

  • 插入一个区间(左端点 lo,右端点 hi)。
  • 搜索一个区间(左端点 lo,右端点 hi)。
  • 删除一个区间(左端点 lo,右端点 hi)。
  • 区间交集查询:给定一个区间(左端点 lo,右端点 hi),在数据结构中查找所有与该区间相交(或至少有一个相交)的区间。

在这里插入图片描述

4.2:区间搜索树定义

在这里插入图片描述

创建一个 BST,其中每个节点存储一个区间(左端点 lo,右端点 hi)。

  • 将区间的左端点作为 BST 中节点的key。
  • 在以当前节点为根节点的子树中,存储该子树内所有区间右端点的最大值。

4.3:区间搜索树 demo 演示

4.3.1:插入

在这里插入图片描述

要插入一个区间(左端点 lo,右端点 hi):

  • 使用左端点 lo 作为key,将其插入到BST中。
  • 在搜索路径上的每个节点上更新最大右端点值。

插入区间 (16, 22) :

在这里插入图片描述

依次使用区间左端点 16 与各个节点左端点进行比较,直到遇到空链接,最终插入 BST:
(这一步比较简单,不再一一截图,给出路线图)

在这里插入图片描述

插入之后,需要检查并更新路径上每个节点的最大值:

在这里插入图片描述

4.3.2:搜索命中

在这里插入图片描述

要搜索与查询间隔 ( lo, hi ) 相交的任何一个间隔:

  • 如果节点中的区间与查询区间相交,则返回。
  • 否则如果左子树为空,则向右走。
  • 否则如果左子树的最大端点小于lo,则向右走。
  • 否则向左走。

搜索区间 (23, 25) :

初始状态:

在这里插入图片描述

比较根节点 (17, 19) ,没有相交:

在这里插入图片描述

比较左子树最大端点22 < 23,右移:

在这里插入图片描述


在这里插入图片描述

比较节点 (21, 24) ,相交,搜索命中:

在这里插入图片描述

4.3.3:搜索未命中

搜索区间 (12, 14) :

初始状态:

在这里插入图片描述

比较根节点 (17, 19) ,没有相交:

在这里插入图片描述

左子树不为空,且左子树最大端点 22 > 12,左移:

在这里插入图片描述

比较节点 (5, 8) ,没有相交:

在这里插入图片描述

比较左子树最大端点8 < 12,右移:

在这里插入图片描述


在这里插入图片描述

比较节点 (15, 18) ,没有相交:

在这里插入图片描述

比较左子树最大端点10 < 12,右移:

在这里插入图片描述


在这里插入图片描述

比较节点 (16, 22) ,没有相交:

在这里插入图片描述

左子树为null,右移:

在这里插入图片描述

右子树为null,没有相交点,搜素未命中:

在这里插入图片描述

4.3.4:搜索代码实现

在这里插入图片描述

4.3.5:搜索分析

在这里插入图片描述

案例 1:如果向右搜索,则左侧没有交集。
证明:假设搜索向右且左子树非空。

  • 由于向右走,我们有 max < lo。
  • 对于x的左子树中的任意区间 (a, b),我们有 b ≤ max < lo
  • 因此,(a, b) 不会与 (lo, hi) 相交。

在这里插入图片描述

案例 2:如果向左搜索,则左子树中要么存在交集,要么两者都没有交集。
证明:假设左边没有交集。

  • 从左边开始,我们有 lo ≤ max。
  • 则对于x的右子树中的任意区间 (a,b),hi < c ≤ a ⇒ 右侧无交集。

4.4:区间搜索树分析

在这里插入图片描述

使用红黑树保证性能。(易于维护辅助信息)

5:矩形交集问题(rectangle intersection)

在这里插入图片描述

5.1:微处理器与几何

在这里插入图片描述

20世纪70年代早期,微处理器设计转变成一个几何学问题。

  • 超大规模集成电路(Very Large Scale Integration,VLSI)
  • 计算机辅助设计(Computer-Aided Design,CAD)

设计规则检查。

  • 某些导线不能相互交叉。
  • 不同类型的导线之间需要保持特定的间距要求。
  • 调试过程 = 正交矩形相交点的搜索。

5.2:算法与摩尔定律

在这里插入图片描述

“摩尔定律”:集成电路的集成度(或者说处理器的运算能力)大约每 18 个月翻一番。

  • 在 197x 年,需要检查 N 个矩形区域的问题;
  • 到了 197(x+1.5) 年,在一台速度提升2倍的计算机上,则需检查 2N 个矩形区域。

自举(Bootstrapping)意味着我们可以利用更快的计算机来设计和验证更大的电路。
(自举的核心思想是指一个系统、过程或算法通过自己的内部机制或有限的基础条件,逐步建立并完善自身的能力或功能。)

但是,仅靠自举是不够的,如果仍然采用二次时间复杂度的算法:

  • 在 197x 年,解决 N 个矩形的问题需要 M 天;
  • 到了197(x+1.5) 年,(即便使用速度提升2倍的计算机,)处理2N个矩形问题仍需时 (4M) / 2 = 2M天。(!)

归根结底,要维持摩尔定律所描述的计算能力增长趋势,采用线性对数时间复杂度(Linearithmic)的算法是必需的。

5.3:矩形相交查询:扫描线算法

在这里插入图片描述

从左至右移动一条垂直扫描线。

  • 将矩形左右端点的x坐标作为事件定义。(当扫描线与矩形边界的x坐标重合时,触发相应的事件处理。)
  • 使用区间搜索树(如红黑树、AVL树等)来存储并维护当前扫描线上相交的所有矩形集合。(这里的存储基于每个矩形在y轴方向上的区间。)
  • 当扫描线扫过一个矩形的左端点时:
    • 对该矩形在y轴方向上的区间进行区间搜索操作,查找是否已存在于搜索树中;
    • 如果不存在,则将该矩形的y轴区间插入到区间搜索树中。
  • 当扫描线扫过一个矩形的右端点时:
    • 从区间搜索树中移除该矩形对应的y轴区间。

(可以回顾一下上篇 #2.1 线段相交的扫描线算法)

移动过程:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

5.4:扫描线算法分析

在这里插入图片描述

命题:扫线算法在一组包含 N 个矩形中找出 R 个交点所需的时间与其大小成比例,即 N log N + R log N。

证明:

  • 首先,将所有矩形的x坐标放入优先队列(PQ)或进行排序。(N log N)
  • 然后,每当扫描线遇到矩形的左端点时,在一个区间搜索树(ST)中插入该矩形对应的y轴区间。(N log N)
  • 当扫描线扫过矩形右端点时,从区间搜索树(ST)中删除对应的y轴区间。(N log N)
  • 在整个过程中,针对每个矩形的y轴区间执行区间搜索操作。(N log N + R log N)

结论:扫线算法通过将二维正交矩形的相交搜索问题转化为一维区间搜索问题,从而降低了问题的复杂性。

6:总结:BST 的几何应用

在这里插入图片描述

(完)

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

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

相关文章

本届挑战赛冠军方案:基于LLM的多场景智能运维

本文介绍本届挑战赛冠军得主SRE-Copilot团队的参赛方案&#xff1a;基于LLM的多场景智能运维。 基础架构-SRE&#xff0c;负责字节跳动基础架构部门所有组件的SRE工作&#xff0c;沿着成本、稳定性、效率、服务四条主线&#xff0c;致力于打造高扩展、高可用的生产系统。基础架…

IntelliJ IDEA 使用 spring Initializr 快速搭建 spring boot 项目遇到的坑

maven使用的是3.5.3 一、创建SpringBoot 二、项目创建成功&#xff0c;启动右键&#xff0c;没有run方法 三、在pom.xml上右键&#xff0c;将其添加为maven项目&#xff0c;然后发现Test模块报错 四、查看pom.xml文件&#xff0c;发现2.3.5Release版本变红&#xff0c;怀疑是版…

基于springboot实现的牙科诊所系统

一、系统架构 前端&#xff1a;html | layui | js | css 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、 代码及数据库 三、功能介绍 01. web端-首页 02. web端-医生介绍 03. web端-新闻资讯 04. web端-关于我们 05. web…

Find My运动相机|苹果Find My技术与相机结合,智能防丢,全球定位

运动相机设计用于在各种运动和极限环境中使用&#xff0c;如徒步、登山、攀岩、骑行、滑翔、滑雪、游泳和潜水等&#xff0c;它们通常具有防抖防震、深度防水和高清画质的特点&#xff0c;能够适应颠簸剧烈的环境&#xff0c;甚至可以承受一定程度的摔落&#xff0c;一些运动相…

云原生精品资料合集(附下载)

云计算是产业数字化转型的关键基础设施,以基础设施资源为中心的云搬迁时代接近尾声&#xff0c;以应用价值为中心的云原生时代已经到&#xff0c;所以IT人员学习云原生正当时&#xff01;最近跟各位大神征集了云原生的教程&#xff0c;行业报告和最佳实践&#xff0c;总有一款适…

Go语言学习-下载

下载网址 https://go.dev/dl/ 选择合适的版本&#xff0c;下载 解压包&#xff0c;按引导下载 完成后打开终端 输入指令 go version看到下载好的版本&#xff0c;就是完成下载了

Unity 常用操作

2D素材网站 https://craftpix.net/ https://itch.io/game-assets/tag-2d/tag-backgrounds 3D素材资源网址 https://www.mixamo.com/#/ 场景常用操作&#xff1a; 快捷键&#xff1a;QWER Q&#xff1a;Q键或鼠标中键&#xff0c;可以拉动场景。 W&#xff1a;选中物体后&…

全局路由守卫报重定向错误

一、报错内容 但是这种情况下&#xff0c;会报路由重定向的错误&#xff0c;如下&#xff1a; Uncaught (in promise) Error: Redirected when going from “/home?_presNosearchoutNo” to “/presSearch” via a navigation guard. 二、报错原因 要给这个项目的所有路由…

前后端分离Vue+nodejs酒店公寓客房预订管理系统udr7l-java-php-django-springboot

本系统的设计与实现共包含13个表:分别是关于我们信息表&#xff0c;配置文件信息表&#xff0c;公寓信息评论表信息表&#xff0c;公寓入住信息表&#xff0c;公寓退房信息表&#xff0c;公寓信息信息表&#xff0c;公寓预订信息表&#xff0c;系统公告信息表&#xff0c;收藏表…

使用Java和PostGis的全国A级风景区数据入库实战

目录 前言 一、数据介绍 1、空间数据 2、属性表说明 3、QGIS数据预览 二、PostGIS空间数据库设计 1、空间表结构 三、Java空间入库 1、实体定义 2、数据操作Mapper 3、业务层实现 4、入库 5、数据入库验证 总结 前言 星垂平野阔&#xff0c;月涌大江流”“晴川历历…

nginx------------缓存功能 (六)

一、http 协议反向代理 &#xff08;一&#xff09;反向代理示例:缓存功能 缓存功能可以加速访问&#xff0c;如果没有缓存关闭后端服务器后&#xff0c;图片将无法访问&#xff0c;缓存功能默认关闭&#xff0c;需要开启。 ​ proxy_cache zone_name | off; 默认off #指明调…

【推荐】一个国内免费体验的AI论文写作网站-「智元兔 AI」

在当今技术飞速发展的时代&#xff0c;越来越多的领域开始应用人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;。其中&#xff0c;AI写作工具备受瞩目&#xff0c;备受推崇。在众多的选择中&#xff0c;智元兔AI是一款在笔者使用过程中非常有帮助的…