二分搜索树和AVL树

问题

跑道预订系统。一个飞机场只有一个飞机跑道,需要为未来的飞机着陆预留空闲的跑道。飞机预订的着陆时间为t,假如没有其他的计划在(t-k,t+k)的时间内着陆的飞机,则将t加入集合R。其中k是变量。请问有没有一种时间复杂度为O(logn)的算法解决这个问题?

例子

3ac294a0961d4b51a820727b74370d17.jpeg

如果现在时间是37, 在R集合中,在41.2,49,和56.3三个时间点上,其他飞机已经预订了跑道。如果有架飞机要预订t=53进行着陆,是可以的,因为49+3<53<56.3-3;而如果是t=44,飞机无法安排因为t=41.2的飞机着陆完毕后t=41.2+3=44.2>41.2。而t=20的时间也不能安排,因为现在已经是t=37了。

如果集合R是未排序的数组或链表;则插入需花费O(1)的时间,但插入前需要依次和集合中的所有元素进行比较,花费的时间是O(n)。

如果时间集合R是个已排序的数组或链表,我们可以尝试用二分查找来做,查找的时间复杂度为O(logn),但如果是数组,则插入时需要移动大量元素,时间复杂度为O(n),总时间复杂度为O(logn+n)。如果是单纯的链表,则无法使用二分查找法。 

以上几种方式都无法满足O(logn)的需求。

二叉搜索树

binary search tree(BST)

8cbd4696bab34e14a53006b4b8043119.jpeg

二分搜索树的不变式对于所有结点x:

  • 如果y是x的左子树,y的值 ≤ x的值;
  • 如果y是x的右子树,y的值 ≥ x的值;

例子在图中。

若h为BST的高度,那么插入元素(不带检查)的时间复杂度是Ο(h)。

最好的情况是BST为平衡的,h=logn,时间复杂度为O(logn)。最差的情况是BST变成一条链表,h=n,时间复杂度为O(n)。

显然BST还是无法完全满足要求。为什么呢?因为BST不平衡。

为此提出了平衡二叉树AVL。

AVL 

我们称BST是平衡的,如果其高度为logn。

AVL树的性质:每一个结点的左右孩子结点的高度差距最多为±1。即 eq?%7Ch_%7Bl%7D-h_%7Br%7D%7C%5Cleq%201

AVL树是平衡的。

结点的高度

结点的高度等于该结点到以其作为根节点的子树的叶子结点的最长路径。

等于max{height(left child),height(right child)}+1

AVL树的最少结点数与最大高度

AVL树是平衡的。最差的情况是每一个结点的左右孩子结点的高度差为1.

记Nh=高度为h的AVL树的最少结点数量,并且根据AVL的递归性质可得:

eq?N_%7Bh%7D%20%3D%201%20&plus;%20N_%7Bh-1%7D%20&plus;%20N_%7Bh-2%7D

由Nh的递归式我们可以估算AVL树的最大高度。

这个数列与斐波那契数列相似。会得到Nh > Fh = (φ^h)/√5,其中Fh是斐波那契数列(数字1,1,2,3,5,8-构成了一个序列。这个数列前面相邻两项之和,构成了后一项),φ=1.618,最后可以通过下图的得到h小于1.44log2n

一个更粗略的估算是eq?N_%7Bh%7D%20%3E%201&plus;2*N_%7Bh-2%7D%20%3E%202*N_%7Bh-2%7D%20%3D%20%5CTheta%20%282%5E%7B%5Cfrac%7Bh%7D%7B2%7D%7D%29,因此h < 2*logn

AVL树的插入

分为两步

①根据BST的规则进行插入

②对插入后的BST进行重新平衡,使其符合AVL树的性质。

左旋与右旋

f3d01935ec224cf79c120840d21adaec.jpeg

进行左旋或右旋操作后,从左往右的次序保持不变。

例子

3c3de569bff54670b58d42383db3dddc.jpeg

往已有的AVL树中插入23,不符合AVL性质,右旋29,符合AVL性质。

80960e128f134f1e9d7255d6b37263c6.jpeg

插入55,不符合AVL性质,左旋50,还是不符合AVL性质,再右旋65,最终符合AVL。进行了两次旋转。

平衡因子

在二叉树中,节点 X 的平衡因子被定义为高度差

重新平衡

详细讨论AVL插入的步骤②

  • 假设x是最低的违背AVL性质的结点(其平衡因子为+2或-2)
  • 假定z是拥有更高子树的孩子

有两种情况

①单次旋转

d384be5fd01e4d7da5922945a15fb1e9.png

②两次旋转

3fb5ae8ab95a44469c6a574b49bb94cd.png

AVL排序

1.按AVL的规则,插入n个结点。O(nlogn)

2.中序遍历AVL树。O(n)

故AVL排序的时间复杂度为O(nlogn)

ADT

一个抽象数据类型规定了 插入/删除、返回最小值、返回前驱/后继 三种操作。

使用Heap可以实现插入/删除和返回最小值。但是如果还要求next_larger和next_smaller(前驱和后继),则需要平衡的BST。

488cefa1c35944fd98bb95558f4c3e1e.jpeg

 

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

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

相关文章

增强PLMs可塑性!MetaAI | 提出主动遗忘机制,加快模型收敛,准确率高出21.2%!

引言 在自然语言处理领域&#xff0c;预训练语言模型&#xff08;PLMs&#xff09;扮演着至关重要的角色&#xff0c;它可以根据任务需求&#xff0c;可迁移至各种下游任务中。然而&#xff0c;PLMs在适应新语言时面临挑战&#xff0c;尤其是在数据和计算资源受限的情况下。本…

数据结构与算法----复习Part 14 (树与二叉树)

本系列是算法通关手册LeeCode的学习笔记 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 目录 一&#xff0c;树&#xff08;Tree&#xff09; 树的相关术语 节点间关系 树的其他术语 二&#xff0c;二叉…

比较JavaScript中的for...in和for...of循环

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

linux解析域名指令 nslookup 或者 host

host www.baidu.com 第二种方法 nslookup www.baidu.com 注意&#xff1a;ns是name server之意

【包邮送书】Elasticsearch 通过索引阻塞实现数据保护深入解析

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

回收小程序系统后台管理功能

会员管理&#xff1a;管理员可以查看和管理会员的基本信息&#xff0c;如姓名、联系方式、寄送地址和订单记录等。 产品管理&#xff1a;对回收物品进行管理&#xff0c;包括分类、规格设定、数据统计等。 订单管理&#xff1a;对所有订单进行追踪和管理&#xff0c;确保订单处…

Leetcode 543. 二叉树的直径

题目描述&#xff1a; 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;ro…

汽车屏类产品(五):仪表Cluster常用芯片i.MX117x

前言: 仪表一般就是指方向盘前面那个表盘。做仪表的芯片最主要需要支持显示Display,而仪表的主要排版布局多种多样,但是主旨显示内容不尽相同。 仪表需求: 1、rpm转速表盘 仪表Cluster一般会有转速表盘rpm,单位一般是x1000,大部分汽车仪表范围就是0~8,也就是最高8000…

MySQL安装使用(mac、windows)

目录 macOS环境 一、下载MySQL 二、环境变量 三、启动 MySql 四、初始化密码设置 windows环境 一、下载 二、 环境配置 三、安装mysql 1.初始化mysql 2.安装Mysql服务 3.更改密码 四、检验 1.查看默认安装的数据库 2.其他操作 macOS环境 一、下载MySQL 打开 MyS…

用 Qt 不怕被告吗?

用 Qt 不怕被告吗? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Qt 的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 收律师函不…

云浮肇庆三维扫描钣金铸件抄数逆向设计外观画3D图上门抄数服务

钣金铸件抄数逆向设计画图是一项精密而富有挑战性的工作&#xff0c;它要求工程师具备深厚的专业知识和丰富的实践经验。3D抄数&#xff0c;即是通过精密测量设备获取钣金铸件的三维数据&#xff0c;为后续的逆向设计提供基础。逆向设计则是指根据已有的实物或模型&#xff0c;…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:StepperItem)

用作Stepper组件的页面子组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 接口 StepperItem() 属性 参数名参数类型参数描述prevLabelstring设置左侧文本按钮内…

2024年软考计划开始了,你准备好了吗?

目录标题 2024年度计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试工作计划计算机软考中级科目哪个含金量最高&#xff1f;报考流程和说明 2024年度计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试工作计划 一、2024年度计算机软件资格考试(初级…

<Linux> 线程控制

目录 一、线程资源的分配 &#xff08;一&#xff09;线程私有资源 &#xff08;二&#xff09;线程共享资源 二、原生线程库 三、线程控制接口 &#xff08;一&#xff09;线程创建 - pthread_create() 1. 一个线程 2. 一批线程 &#xff08;二&#xff09;线程等待 …

linux 新增定时任务

1、创建定时任务 crontab -e 2、加入定时任务规则 0 2 * * * /usr1/local/mysql-backup/backup.sh 说明&#xff1a;backup.sh是sh脚本 3、重启定时任务 service crond restart 扩展 1、查看定时任务列表 crontab -l 2、需要修改定时任务 crontab -e

BUUCTF---web---[护网杯 2018]easy_tornado1

1.点开题目链接 2.依次点开文件链接 3.通过第一个信息可知&#xff0c;flag在文件名为/fllllllllllllag这个里面&#xff0c;第二个信息中的render是渲染函数&#xff0c;第三个个信息中是一个md5加解密&#xff0c;因为filename我们已经知道&#xff0c;所以我们需要找到cooki…

哪些数据可视化工具适合初学者使用?

数据建模及可视化平台&#xff0c;提供一站式全链路数据生命周期管理方案&#xff0c;支持数据建模&#xff0c;支持报表、图谱、大屏可视化应用的快速构建&#xff0c;支持AIBI探索实践&#xff0c;全流程免代码&#xff0c;免费使用 1、功能结构 2、技术架构 3、功能清单

2024年独立站C端只靠SEO还有机会吗?(川圣SEO)蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; 2024年独立站C端只靠SEO还有机会吗&#xff1f;#蜘蛛池SEO 都2024年了&#xff0c;你的外贸独立站推广还需要…

盘点Python中4种读取JSON文件和提取JSON文件内容的方法

目录 一、使用json模块的load()方法 二、使用json模块的loads()方法 三、使用pandas库的read_json()方法 四、使用第三方库如requests从网络API获取JSON数据 总结 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它基于EC…

一文总结CNN中【各类卷积】操作

本文详细总结CNN中各类卷积&#xff0c;旨在指导 domain-specific 更好的模型设计&#xff0c;包括标准卷积&#xff0c;分组卷积&#xff08;Group Conv&#xff09;&#xff0c;深度可分离卷积&#xff08;Depthwise Separable Conv&#xff09;&#xff0c;转置卷积&#xf…