问题背景

如果使用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相关推荐

  1. [题集]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 ...

  2. 通过我写的文章来认识我,博客文章快速导航(慢慢整理)

    1. 前言 个人经历: 2017年 REDHAT intern 2018年 Ericsson intern 2019年 Ericsson developer 2. 推荐系列 从零快速解析之Tinyht ...

  3. 【一看就懂】数据结构以及各种算法的可视化演示工具

    文章目录 大家好,我是只谈技术不剪发的 Tony 老师. 最近发现了一个宝藏网站:Data Structure Visualizations,提供了一个在线的可视化工具,可以交互式地演示各种数据结构和 ...

  4. PAT甲级1147 Heaps (30 分):[C++题解]堆、树的遍历、dfs、完全二叉树建树

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:给定完全二叉树,判断是否是堆,需要区分大根堆,小根堆.后面是输出后序遍历. AC代码 #include<bits/stdc++. ...

  5. Heaps 高性能游戏引擎

    Heaps是专为高性能游戏设计的跨平台图形引擎,它旨在利用台式机.移动设备和游戏主机上常见的现代 GPU. Heaps 是一款成熟的跨平台图像引擎,专为高性能游戏设计.它的设计目的是利用桌面和移动设备 ...

  6. DSP6657打印ti.sysbios.heaps.HeapMem,内存问题

    调试多核6657dsp跑程序的时候,打印了如下错误,一看,应该是内存出问题了,准确地说应该是内存泄漏了 ti.sysbios.heaps.HeapMem: line 221: out of memor ...

  7. heaps 和 priority queue堆和优先队列的定义和数据结构表示

    heaps 堆:并非一对杂乱无章的结构, 堆是一种存在特殊关系的树. 是一种半排序的树, 所有的父节点大于子节点(max heaps) 或 所有的父节点小于子节点(min heaps).上图为max ...

  8. CodeForces - 538F--A Heap of Heaps(树状数组+离线)

    题目链接https://codeforces.com/problemset/problem/538/F Time limit 3000 ms Memory limit 524288 kB Andrew ...

  9. 斐波那契堆(Fibonacci heaps)

    一:斐波那契堆 1:特性 斐波那契堆同二项堆一样,也是一种可合并堆.斐波那契堆的优势是:不涉及删除元素的操作仅需要O(1)的平摊运行时间(关于平摊分析的知识建议看<算法导论>第17章).和 ...

  10. 【CF538F】 A Heap of Heaps

    题目 展开 题目描述 Andrew skipped lessons on the subject 'Algorithms and Data Structures' for the entire ter ...

最新文章

  1. HDU7059-Counting Stars 线段树 (区间加最低位置,区间减最高位)
  2. Virtual Lab. For Probability and Statistics
  3. LTE voice centric和data centric
  4. 30个流行的jQuery Plugins
  5. 方法重载(overload)和方法重写(override)的比较
  6. 前端学习(3276):js中this的使用
  7. 量子纠缠背后的故事(三):维格纳的朋友 精选
  8. vmware+centeros7安装JavaJDK
  9. 在哪里定义_定义市场的关键字:找出它们在哪里使用,以便您可以抢占该市场...
  10. 遗传算法原理及应用二(交叉算子、变异算子与运行参数选择)
  11. CentOS7.5搭建ELK6.2.4集群与简单测试
  12. synaptics触摸板_使用Dell Synaptics触摸板修复Firefox滚动问题
  13. PHP响应button的onclick事件
  14. 常见的几种最优化方法(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)
  15. 小白学习编程最容易进入的六大误区,你中招了吗?
  16. 车规级芯片IC等级及其特点
  17. 【linux】lsb_release -a命令
  18. 算法导论第二章部分习题自我解答
  19. Altium脚本开发
  20. 数据库关系模型不合理会带来什么问题?

热门文章

  1. SQL注入中information_schema的作用
  2. hdmi接口线_视频接口与视频线详解!
  3. Golang环境windows 设置 GOROOT 和 GOPATH
  4. 【BP回归预测】基于matlab改进的鲸鱼算法优化BP神经网络回归预测(多输入单输出)【含Matlab源码 2184期】
  5. 离散数学学习心得(一)逻辑和证明
  6. 风险模型—VaR模型1
  7. wps怎么把边框加粗_怎么设置WPS表格边框线加粗 - 卡饭网
  8. 报价管理解决方案丨汇信
  9. 如何正确地准备KODI媒体文件
  10. case …when… 与纵表转横表