【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.mzph.cn/news/708643.shtml

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

相关文章

[RCTF2015]EasySQL1 题目分析与详解

一、题目介绍&#xff1a; 1、题目来源&#xff1a; BUUCTF网址 2、题目介绍&#xff1a; 拿到flag。 二、解题思路&#xff1a; 我们发现题目首页有登录和注册账号两个选项&#xff0c;我们首先尝试注册账号&#xff0c;尝试注册username为admin的账号&#xff0c;输入密码…

如何更改虚拟机服务端口

如何更改虚拟机服务端口 背景internet information services开启/安装 IIS打开IIS管理器 修改端口 背景 今天我们来讲一下如何更改我们服务所占用的端口号&#xff0c;假设我们在虚拟机或者本地计算机上部署了一个服务&#xff0c;然后这个服务呢&#xff0c;我们默认安装了&a…

一番赏小程序开发,提升用户体量,增加收益

随着我国年轻人逐渐成为消费主力军&#xff0c;盲盒一番赏迅速迎来高速发展期&#xff0c;一番赏的市场规模也迅速扩大。 在互联网的支持下&#xff0c;当下国内形成了线上消费热潮&#xff0c; 一番赏开启了线上抽赏&#xff0c;衍生出了线上一番赏小程序&#xff0c;这让更多…

快速掌握MySql的常用基本操作

MySql 基本操作 一、MySql的数据类型二、MySql运算符三、MySql常用函数四、MySql完整性约束五、MySql核心操作&#xff08;库、表、CRUD、连接&#xff09;库操作表操作CRUD通过存储过程生成大量测试数据连接查询 一、MySql的数据类型 整数类型字节最小值最大值TINGINT1有符号…

白酒:生产过程的可追溯性与质量控制

在豪迈白酒的生产过程中&#xff0c;可追溯性与质量控制是确保产品安全与品质的重要手段。随着消费者对食品安全与质量的关注度不断提高&#xff0c;建立多方的可追溯体系和严格的质量控制措施成为了酒庄的必然选择。 首先&#xff0c;可追溯性是指从原材料到产品的整个生产过程…

electron安装最后一部卡住了?

控制台如下错误 不是的话基本可以划走了 这个很可能是镜像出现问题了&#xff0c;不一定是npm镜像 打开npm的配置文件添加下述 electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ electron_builder_binaries_mirrorhttps://npmmirror.com/mirrors/electron-build…

vscode 设置打开终端的默认工作目录/路径

vscode 设置打开终端的默认工作目录/路径** 文章目录 vscode 设置打开终端的默认工作目录/路径**打开vscode&#xff0c;打开设置UI 或是设置JSON文件&#xff0c;找到相关设置项方式1&#xff1a;通过打开settings.json的UI界面 设置:方式2&#xff1a;通过打开设置settings.j…

深入理解网络通信基本原理和tcp/ip协议

深入理解网络通信基本原理和tcp/ip协议 一、计算机网络体系1&#xff0c;计算机网络体系结构2&#xff0c;网络中数据传输2.1&#xff0c;浏览器中输入一个url的执行流程2.2&#xff0c;数据在网络中是的传输流程 3&#xff0c;三次握手和四次挥手3.1&#xff0c;三次握手3.1.1…

leetcode 2581. 统计可能的树根数目【换根dp】

原题链接&#xff1a;2581. 统计可能的树根数目 题目描述&#xff1a; Alice 有一棵 n 个节点的树&#xff0c;节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges 表示&#xff0c;其中 edges[i] [ai, bi] &#xff0c;表示树中节点 ai 和 bi 之间有一条边…

【appium】Hybrid应用自动化|微信小程序自动化

目录 一、Hybrid&#xff08;nativewebview&#xff09;应用自动化 1、webview 2、Hybrid应用自动化实现 2.1准备工作 Step1&#xff1a;准备android 4.4版本以上的手机/模拟器 Step2&#xff1a;在app源码中将webview调试模式打开 Step3&#xff1a;安装UC开发者工具 U…

4_相机透镜畸变

理论上讲&#xff0c;是可能定义一种透镜而不引入任何畸变的。然而现实世界没有完美的透镜。这主要是制造上的原因&#xff0c;因为制作一个“球形”透镜比制作一个数学上理想的透镜更容易。而且从机械方面也很难把透镜和成像仪保持平行。下面主要描述两种主要的透镜畸变并为他…

ICVQUANTUMCHINA报告:《2024全球量子计算产业发展展望》

2月20日&#xff0c;《2024量子计算产业发展展望》的中文版报告通过光子盒官方平台发布&#xff0c;英文版报告通过ICV官方平台发布。 英文版报告获取地址&#xff1a; https://www.icvtank.com/newsinfo/897610.html 在过去的一年里&#xff0c;光子盒与您一同见证了全球量子…

10 款最佳硬盘分区软件知识分享(2024更新)

硬盘分区软件是您当前需要的最重要的软件之一。我们知道&#xff01; 当今的硬盘分区软件具有令人难以置信的多功能性&#xff0c;并且由于激烈的竞争&#xff0c;对于大多数人来说仍然是相对低成本的投资。 目前&#xff0c;市场上有数十种硬盘分区软件可供选择 - 找到 2024…

力扣-移除元素

问题 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

进销存是什么意思?如何开发一款进销存管理系统?

这篇给大家详细介绍一下&#xff0c;进销存到底是什么&#xff0c;进销存管理系统有什么用&#xff1f;企业如何开发一款进销存管理系统&#xff1f; 以下内容示例工具均来自于JDY——https://www.jiandaoyun.com 一、进销存是什么&#xff1f; 1、基本概念 进销存&#xff0…

HarmonyOS开发云工程与开发云函数

创建函数 您可直接在DevEco Studio创建函数、编写函数业务代码、为函数配置调用触发器。 1.右击“cloudfunctions”目录&#xff0c;选择“New > Cloud Function”。 2.输入函数名称后&#xff0c;点击“OK”。 函数名称仅支持小写英文字母、数字、中划线&#xff08;-&a…

vue中组合式API和选项式API的区别

组合式api&#xff08;Composition API&#xff09;是vue3对我们开发者来说变化非常大的更新&#xff0c;我们先不关注具体语法&#xff0c;先对它有一个大的感知。 通过vue2, vue3两种形式实现同一个需求&#xff0c;理解vue3的compition api 带来的好处 两个独立的功能&…

leetcode 重复的子字符串

前要推理 以abababab为例&#xff0c;这里最主要的就是根据相等前后缀进行推导 s [ 0123 ] 如 t【 0123 】 f 【01 23 】 后两个分别是前后缀&#xff0c;第一个是总的字符串&#xff0c;然后可以推导 //首先还是算出…

从Spring Boot应用上下文获取Bean定义及理解其来源

前言 在Spring框架中&#xff0c;Bean是组成应用程序的核心单元。特别是在Spring Boot项目中&#xff0c;通过使用SpringApplication.run()方法启动应用后&#xff0c;我们可以获得一个ConfigurableApplicationContext实例&#xff0c;这个实例代表了整个应用程序的运行时环境…

ArcgisForJS如何使用ArcGIS Server发布的GP服务?

文章目录 0.引言1.ArcGIS创建GP服务2.ArcGIS Server发布GP服务3.ArcgisForJS使用ArcGIS Server发布的GP服务 0.引言 ArcGIS for JavaScript&#xff08;或简称AGJS&#xff09;是一个强大的工具&#xff0c;它允许开发者使用JavaScript在Web浏览器中创建和运行ArcGIS应用程序。…