Leftist Heaps
问题背景
如果使用original heaps的数据结构,合并两个堆需要Θ(n)的时间,等同于建立一个新的堆的时间,并且拷贝操作需要额外的空间。
我们可以用Leftist Heaps实现时间复杂度为O(n)的更有效率的合并。
NPL的引入
1. 定义:null path length,该节点到一个没有两个儿子的节点的最短路径的长度。规定NPL(NULL)=-1。
2. 推论:NPL(X)= min(NPL(X的儿子))+1(对任意节点包括没有两个儿子的节点成立)。
Leftist Heaps定义
满足original heaps优先级要求(即每个节点的优先级大于它的所有子节点的优先级),并且每一个节点左子树NPL值不小于右子树的NPL值。
Leftist Heaps特点
1. Leftist Heaps是一种便于merge的数据结构。
2.Leftist Heaps是一种不平衡的数据结构。
3. Leftist Heaps不仅要存储节点元素值,还要存储NPL,不再能用数组实现。
4. Leftist Heaps的任意子树也是Leftist Heaps(从定义可知)。
5. Leftist Heaps的right path(右侧路径)上节点数不大于任何路径上的节点数(right path是从根节点开始,不断前往右子节点构成的路径)。
6. 如果一个Leftist Heap的right path上有r个节点,那么该Leftist Heap至少有2^r-1个节点(数学归纳可以证明)。也就是说如果一个Leftist Heap有N个节点,那么该Leftist Heap的右侧路径至多有log(N+1)个节点。对right path进行操作,时间复杂度是O(logN)。
Leftist Heaps的merge操作(重点)
时间复杂度:O(logN)。
递归实现的步骤如下:(实际C语言实现中分为合并的驱动函数和合并的实际操作函数,具体见后面的实现)
1. 如果一个空左倾堆和一个非空左倾堆合并,返回非空左倾堆(递归中的base case)。
2. 如果两个左倾堆都非空,那么比较两个根节点。取较小的节点为新的根节点(为了符合堆的优先级要求),合并较小根节点堆的右子堆和较大根节点堆。
3. 如果右子堆NPL大于左子堆NPL,交换右子堆和左子堆。
4. 更新根节点的NPL=右子堆NPL+1。
非递归实现的步骤如下:
1、把所有节点的右子树分离出来。
2、把分离出来的子树按根节点元素升序(广义上的升序)排列。
3、从后向前,把最后一个树作为倒数第二个树的左子树,检查倒数第二个树左右子树NPL是否满足要求,若不满足,把倒数第二个树左右子树交换。
(可以用栈实现,如果降序排列的话就可以用堆实现)
其他建立在合并操作上的操作:
插入看做是原倾堆和一个节点的左倾堆的合并。
删除看做是删除根节点,将剩余的左右子堆合并。(复习:堆的删除操作特指删除根节点,即得到优先级最高的元素)
Leftist Heaps总体思想
1. Leftist Heaps通过不平衡的节点分布,让right path保持较短状态,把合并操作建立在对right path操作上,提高合并效率。
2. 在合并过程中,通过左右子树互换来保持”左倾“的性质。
Reference
纸上谈兵: 左倾堆 (leftist heap)
左堆(Leftist Heaps)(举例图解很清楚明白)
Leftist Heaps相关推荐
- [题集]Lecture 4. Leftist Heaps and Skew Heaps
1.A leftist heap with the null path length of the root being r must have at least 2 r + 1 − 1 2^{r+1 ...
- 通过我写的文章来认识我,博客文章快速导航(慢慢整理)
1. 前言 个人经历: 2017年 REDHAT intern 2018年 Ericsson intern 2019年 Ericsson developer 2. 推荐系列 从零快速解析之Tinyht ...
- 【一看就懂】数据结构以及各种算法的可视化演示工具
文章目录 大家好,我是只谈技术不剪发的 Tony 老师. 最近发现了一个宝藏网站:Data Structure Visualizations,提供了一个在线的可视化工具,可以交互式地演示各种数据结构和 ...
- PAT甲级1147 Heaps (30 分):[C++题解]堆、树的遍历、dfs、完全二叉树建树
文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:给定完全二叉树,判断是否是堆,需要区分大根堆,小根堆.后面是输出后序遍历. AC代码 #include<bits/stdc++. ...
- Heaps 高性能游戏引擎
Heaps是专为高性能游戏设计的跨平台图形引擎,它旨在利用台式机.移动设备和游戏主机上常见的现代 GPU. Heaps 是一款成熟的跨平台图像引擎,专为高性能游戏设计.它的设计目的是利用桌面和移动设备 ...
- DSP6657打印ti.sysbios.heaps.HeapMem,内存问题
调试多核6657dsp跑程序的时候,打印了如下错误,一看,应该是内存出问题了,准确地说应该是内存泄漏了 ti.sysbios.heaps.HeapMem: line 221: out of memor ...
- heaps 和 priority queue堆和优先队列的定义和数据结构表示
heaps 堆:并非一对杂乱无章的结构, 堆是一种存在特殊关系的树. 是一种半排序的树, 所有的父节点大于子节点(max heaps) 或 所有的父节点小于子节点(min heaps).上图为max ...
- CodeForces - 538F--A Heap of Heaps(树状数组+离线)
题目链接https://codeforces.com/problemset/problem/538/F Time limit 3000 ms Memory limit 524288 kB Andrew ...
- 斐波那契堆(Fibonacci heaps)
一:斐波那契堆 1:特性 斐波那契堆同二项堆一样,也是一种可合并堆.斐波那契堆的优势是:不涉及删除元素的操作仅需要O(1)的平摊运行时间(关于平摊分析的知识建议看<算法导论>第17章).和 ...
- 【CF538F】 A Heap of Heaps
题目 展开 题目描述 Andrew skipped lessons on the subject 'Algorithms and Data Structures' for the entire ter ...
最新文章
- HDU7059-Counting Stars 线段树 (区间加最低位置,区间减最高位)
- Virtual Lab. For Probability and Statistics
- LTE voice centric和data centric
- 30个流行的jQuery Plugins
- 方法重载(overload)和方法重写(override)的比较
- 前端学习(3276):js中this的使用
- 量子纠缠背后的故事(三):维格纳的朋友 精选
- vmware+centeros7安装JavaJDK
- 在哪里定义_定义市场的关键字:找出它们在哪里使用,以便您可以抢占该市场...
- 遗传算法原理及应用二(交叉算子、变异算子与运行参数选择)
- CentOS7.5搭建ELK6.2.4集群与简单测试
- synaptics触摸板_使用Dell Synaptics触摸板修复Firefox滚动问题
- PHP响应button的onclick事件
- 常见的几种最优化方法(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)
- 小白学习编程最容易进入的六大误区,你中招了吗?
- 车规级芯片IC等级及其特点
- 【linux】lsb_release -a命令
- 算法导论第二章部分习题自我解答
- Altium脚本开发
- 数据库关系模型不合理会带来什么问题?