左偏树原理详解

news2024/11/23 3:18:44

一 点睛

左偏树(leftist tree 或 leftist heap)也叫作左偏堆、左倾堆、左式堆,是计算机科学中的一种树,也是一种优先队列实现方式,属于可并堆,在信息学中十分常见,在统计、最值、模拟、贪心等类型的题目中应用广泛。

左偏树并不是平衡树,它不是为了快速访问节点而设计的,可以快速访问最大(或最小)节点,并在树中修改后快速合并。左偏树合并操作的时间复杂度在最坏情况下为O(logn ),完全二叉堆合并操作的时间复杂度在最坏情况下为O (n ),所以左偏树更适用于合并操作的情形。

二 堆、优先队列、可合并堆和左偏树的区别

堆:可以被看作一棵完全二叉树的顺序存储结构,在这棵完全二叉树中,若每个节点的值都大于或等于左右子节点的值,则称之为最大堆;若每个节点的值都小于或等于左右子节点的值,则称之为最小堆。

优先队列:利用堆来实现的,取得最大值(或最小值)需要O(1)时间,删除最大值(或最小值)需要O (logn )时间,插入元素也需要O (logn )时间。

可合并堆:支持合并操作的堆,除了支持优先队列的三种基本操作,还支持合并操作。

左偏树:是一棵有堆序性和左偏性的二叉树,是一种可合并堆的实现。

三  左偏树的性质

1 堆序性

节点的值大于或等于(或小于或等于)其左右子节点的值。对最大堆,父节点大、子节点小,即key(i)≤key(parent(i))(注意:左偏树只有键值大小满足堆序性质,不再满足完全二叉树的结构性质)。每个节点的值都大于或等于其左右子节点的值,如下图所示。

2 左偏性

左偏性指“向左偏”。节点的左子节点的距离大于或等于右子节点的距离。左偏树的节点除了和二叉树的节点一样有左右子树,还有两个属性:外节点和距离。

• 外节点:节点 i 的左子树或右子树为空时,节点 i 被称为外节点。

• 距离:节点 i 的距离指节点 i 到它的后代中最近的外节点所经过的边数。特别地,若节点 i 自身是外节点,则它的距离为 0;空节点的距离为 -1。左偏树的距离指树根到最近的外节点所经过的边数。

一棵左偏树如下图所示,树根到最近外节点的距离为 2,因此该左偏树的距离为2。

左偏树有左偏性,每个节点的左子节点的距离都大于或等于右子节点的距离,dist(lc(i))≥dist(rc(i))。

左偏性是以距离衡量的,并不意味着左子树的树高大于或等于右子树的树高。

3 节点的距离等于它的右子节点的距离加 1

因为左偏性保证每个节点的左子节点的距离都大于或等于右子节点的距离,而节点的距离等于最近外节点的距离,因此节点的距离等于右子节点的距离加1:dist(i)=dist(rc(i))+1。

4 n 个节点的左偏树距离最多为 log(n+1)-1

四 左偏树的基本操作之合并

左偏树的基本操作包括合并根节点、删除根节点、插入节点和创建左偏树等。

1 合并

左偏树的合并操作是其他操作的基础,该操作需要满足左偏树的两个基本性质。如下图所示,假设两个左偏树的树根分别为a、b,则合并这两棵左偏树的步骤如下。

(1)比较 a、b 的关键字,若 key(a)≤key(b),则交换两棵左偏树,保证最大堆的堆序性。

(2)合并 a 的右子树与以 b 为根的左偏树,将合并后的左偏树作为 a 的右子树。

(3)比较 a 的左右子树距离,若左子树的距离小于右子树,则交换。然后更新 a 的距离为右子树的距离加 1。

2 图解

两棵左偏树如下图所示,合并两棵左偏树的过程如下。

(1)比较树根的关键字,28>20,无须交换。

(2)合并 28 的右子树与以 20 为根的左偏树。

(3)比较树根的关键字 18 和 20,18<20,交换两棵左偏树。

(4)合并 20 的右子树与以 18 为根的左偏树。

(5)比较树根的关键字 15 和 18,15<18,交换两棵左偏树。

(6)合并 18 的右子树与以 15 为根的左偏树。18 的右子树为空,15 作为 18 的右子树。

(7)比较 18 的左右子树距离,左子树的距离小于右子树的距离,左右子树交换。然后更新 18 的距离为其右子树的距离加 1,其右子树为空,距离为 -1,因此 18 的距离为 0。

(8)比较 20 的左右子树距离,左子树的距离大于右子树,无须交换。然后更新 20 的距离为其右子树的距离加 1,20 的距离为 1。

(9)比较 28 的左右子树距离,左子树的距离小于右子树,左右子树交换。然后更新 28 的距离为右子树的距离加 1,28 的距离为 1。

五 左偏树的基本操作之删除

删除根节点时只需将左右子树的父节点修改为自己,然后合并左右子树即可。删除根节点(最大或最小节点)是基于合并操作的,其时间复杂度为O (logn )。

六 左偏树的基本操作之插入节点

插入一个新节点,首先创建一棵只包含一个新节点的左偏树,然后和原树合并。插入是基于合并操作的,其时间复杂度为O (logn )。

七 左偏树的基本操作之创建左偏树

1 创建一棵左偏树时有两种方法

① 将每个节点都依次插入,每次插入的时间复杂度都为O (logn),总的时间复杂度为O (nlogn );

② 两两合并,将 n 个节点放入先进先出队列,依次从队头取出两棵左偏树,合并后加入队尾,直到只剩下一棵左偏树,其时间复杂度为O(n)。

2 图解

输入序列 1, 2, 3, 4, 5, 6, 7, 8,构建一棵左偏树,其过程如下图所示。

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

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

相关文章

Win11安装WSL2和Nvidia驱动(2022-12-19)

文章目录前言系统环境WSL 1和WSL 2功能对比安装WSL2更新和升级包配置VSCode配置GPU加速安装Nvidia驱动安装Cuda Toolkit通过PyTorch安装CUDA Toolkit测试Nvcc参考链接前言 以前捣鼓过wsl&#xff0c;即Windows下的Linux子系统&#xff0c;但兼容性依然比不过原生的Linux系统&a…

【Linux】进程间通信之管道

目录&#x1f308;前言&#x1f338;1、IPC介绍&#x1f362;1.1、进程间通信的目的&#x1f361;1.2、背景和发展&#x1f360;1.3、进程间通信的分类&#x1f337;2、管道&#x1f361;2.1、概念&#x1f362;2.2、管道的原理&#x1f363;2.3、匿名管道&#x1f364;2.4、管…

DOM算法系列004-判断给定节点是否为body元素

UID: 20221218221939 aliases: tags: source: cssclass: created: 2022-12-18 如果我们要判定给定的一个节点是不是页面body与元素节点&#xff0c;该如何判断呢&#xff1f; 一般来说&#xff0c; 一个HTML页面内只有一个body元素 但是&#xff0c;如果我们非要在页面内写超过…

Spring boot 整合 redis

Spring boot 整合 redis一、Spring boot 整合redis1.1 启动redis1.2 redis desktop manager1.3 常用命令二、操作2.1 依赖包2.2 配置2.3 简单测试2.4 StringRedisTemplate一、Spring boot 整合redis 1.1 启动redis 命令行启动 redis-server redis-cli1.2 redis desktop mana…

基于electronbot作品bootLoader设计

文章目录 前言 一、芯片程序区规划和流程 1、flash区规划 2、两区运行流程 3、bootLoader代码体现 4、electronbot代码体现&#xff1a; 二、bootLoader代码设计 1.下载程序步骤 2.通讯协议格式 三、libusb开发及需要注意的事情 1、bootLoader复合设备 2、electronbot复合设备…

基础算法系列--[基本数据结构KMP]

文章目录前言链表单链表双链表栈和队列栈队列单调KMP前言 今天要搞的是基本的一些数据结构&#xff0c;当然咱们这个不是那么“正经”。当然今天也没啥代码&#xff0c;因为太简单了&#xff08;其实我也想水一下~&#xff09; 链表 单链表 单链表这个东西&#xff0c;应该…

Prometheus+Grafana

K8S prometheusK8S1.Prometheus&#xff08;普罗米修斯&#xff09;2.Prometheus可以做什么3.Prometheus的特点4.prometheus 相关组件二、prometheus与zabbix的区别zabbix架构区别三、prometheus架构分析1.TSDB2.时间序列数据库的特点3.prometheus 相关组件1.prometheus 核心组…

【计算机网络】实验五 网络层与链路层协议分析(PacketTracer)

一、实验目的 通过本实验&#xff0c;进一步熟悉PacketTracer的使用&#xff0c;学习路由器与交换机的基本配置&#xff0c;加深对网络层与链路层协议的理解。 二、实验内容&#xff1a; 4.1 路由器交换机的基本配置 打开下面的实验文件&#xff0c;按提示完成实验。 4.2…

直流微电网中潮流(Matlab代码实现)

目录 1 概述 1.1 直流电网中的潮流 1.2 创新点和相关工作 1.3 本文结构 2 数学/网络模型 2.1 主-从操作 2.2 孤岛运行 3 牛顿法 4 案例及Matlab代码实现 1 概述 潮流是一个非线性问题&#xff0c;需要用牛顿法求解具有恒定功率端子的直流微电网。本文提出了牛顿法在…

曙光来临!Nature终于发现了新冠特效药?或将彻底终结新冠时代!

百趣代谢组学文献分享&#xff1a;2022年即将过去&#xff0c;随着疫苗的全面接种和三年以来“动态清零”的坚持&#xff0c;我们在应对新冠病毒如潮水般的攻击中取得了阶段性成果。虽然大家陆陆续续投入到正常的工作生活中&#xff0c;但是我们都知道新冠并未被“打败”&#…

MySQL中这14个有用的小知识,快学起来吧

前言 我最近用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中&…

如何在产品开发中讨论概念设计?

每当你看到一辆在路上行驶的汽车、书桌上的笔记本电脑、工业包装生产线、医院设备、家用仪器和其他形式的概念设计创意产品会感到难以置信&#xff0c;这就是我们在产品开发中讨论概念设计的原因。 概念设计是一个尚未解决或到目前为止尚未令人满意的问题。这是一个深思熟虑的解…

研究区域制图 | 在 ArcGIS Pro中创建地图布局

研究区域制图 | 在 ArcGIS Pro中创建地图布局 数据准备 首先需要两个图层&#xff0c;一个是市区图层&#xff0c;一个是省行政区划图层&#xff0c;我这里以吉林省以及吉林省长春市为例 新建布局 选择横向A5即可 添加参考线 不知道你们知不知道这个功能&#xff0c;反正小…

kotlin协程笔记:Dispatchers

Kotlin 的 launch 会调用 startCoroutineCancellable()&#xff0c;接着又会调用 createCoroutineUnintercepted()&#xff0c;最终会调用编译器帮我们生成 SuspendLambda 实现类当中的 create() 方法。 public fun CoroutineScope.launch(context: CoroutineContext EmptyC…

【JVM】本地方法栈与堆与方法区

文章目录1. 本地方法栈2. 堆3. 方法区1. 本地方法栈 本地方法栈和虚拟机栈有点类似&#xff0c;均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常。 但是不同之处在于本地方法栈服务的对象是JVM执行的native方法&#xff0c;而虚拟机栈服务的是JVM…

[附源码]Nodejs计算机毕业设计教师职称评定系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

免费提供POSMV的GNSS数据解算服务,验潮仪丢失的一种补救

前两天有个网友问干活的区域附近是否有长期验潮站&#xff0c;因为他的临时验潮仪丢失了&#xff0c;随后问了一下搞水文的同事&#xff0c;他推了一个网址&#xff1a; http://publictide.nmdis.org.cn/tide?SiteGroup3&TideType0&#xff0c;中文名叫&#xff1a;潮汐潮…

C型利钠肽 ,101135-67-5

Bz-VGR-pNA, chromogenic substrate for trypsin and for bacterial trypsin-like proteases.Bz-VGR-pNA&#xff0c;胰蛋白酶和细菌胰蛋白酶样蛋白酶的显色底物。 编号: 127015中文名称: C型利钠肽 (TYR0)-C-PEPTIDE (DOG)英文名: (Tyr0)-C-Peptide (dog)CAS号: 101135-67-5单…

机房动环监控系统3大价值,第一个太惊艳了

在中小学、大学院校中&#xff0c;机房已经是不可缺少的部分&#xff0c;但由于管理缺陷、设备复杂等缘故&#xff0c;学校机房得不到安全保障。 因此&#xff0c;要实现学校机房监控系统&#xff0c;来对机房的运行情况实时监测&#xff0c;以此提高风险预防及设备运行环境质量…

C++利用模板实现消息订阅和分发

解耦是编写程序所遵循的基本原则之一&#xff0c;多态是提高程序灵活性的重要方法。C语言支持重载&#xff0c;模板&#xff0c;虚函数等特性&#xff0c;为编写高性能可扩展的程序提供了利器。编写大型项目时&#xff0c;免不了需要各个模块之间相互调用&#xff0c;从而产生了…