Skew Heaps
问题背景
Skew Heaps是对Leftist Heaps的改进,Skew Heaps也是一个用于快速合并的数据结构,但无需存储NPL信息,节省了空间。虽然不能保证是左倾树,但是通过无条件交换左右子树,达到平摊意义上的左倾(因为左式堆的合并都是沿最右路径进行的,所以合并之后最右路径长度必然增加,影响操作效率,所以将其与左子树交换)。
Skew Heaps的定义
Skew Heaps可以递归地定义如下:
1、只有一个元素的堆是斜堆(base case)。
2、两个斜堆通过斜堆的合并操作,得到的结果仍然是斜堆。
Skew Heaps的merge操作
时间复杂度:摊还时间为O(logN),最坏情况为O(N)。
递归实现(和Leftist Heaps一样,只是交换变成无条件的了):
1、如果一个空左倾堆和一个非空左倾堆合并,返回非空左倾堆(递归中的base case)。
2、如果两个左倾堆都非空,那么比较两个根节点。取较小的节点为新的根节点(为了符合堆的优先级要求),合并较小根节点堆的右子堆和较大根节点堆。
3、交换右子堆和左子堆。
非递归实现(更繁琐,并且需要外部排序):
1、把所有节点的右子树分离出来。
2、把分离出来的子树按根节点元素升序(广义上的升序)排列。
3、从后向前,把倒数第二个树左右子树交换,把最后一个树作为倒数第二个树的左子树。
(可以用栈实现,如果降序排列的话就可以用堆实现)
一个有趣的事
The result of inserting keys 1 to 2^k -12k−1 for any k>4k>4 in order into an initially empty skew heap is always a full binary tree.
Reference
斜堆 维基百科 (有非递归算法的介绍)
Skew 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 ...
- 【一看就懂】数据结构以及各种算法的可视化演示工具
文章目录 大家好,我是只谈技术不剪发的 Tony 老师. 最近发现了一个宝藏网站:Data Structure Visualizations,提供了一个在线的可视化工具,可以交互式地演示各种数据结构和 ...
- 百练 2973 Skew数 解题报告
思路: 计算出每一个skew数的不同位数表示的权值,然后用该位与权值相乘.用int数组来装权值,用char数组来装skew数. 代码: #include<stdio.h> #include ...
- css3价格斜切_CSS3倾斜skew()方法_CSS3教程_绿叶学习网
9.5 倾斜skew()方法 作者(helicopter) 赞(22) 浏览(26434) 说明:原创教程,禁止转载 一.skew()方法 在CSS3中,我们可以使用skew()方法将元素倾斜显示. ...
- R语定义函数对宽分布(wide distribution )、有偏分布(skew distribution)的数据进行对数变换(符号对数变换函数、signed log transformation)
R语言自定义函数对宽分布(wide distribution ).有偏分布(skew distribution)的数据进行对数变换(符号对数变换函数.signed log transformation ...
- 数字电路时钟问题——Jitter与Skew区别
在博文:时序分析之静态分析基础中提到了一次时钟偏斜问题,只是一笔带过而已,这里重新拿过来看看,并且添加时钟抖动(Jitter)相关知识点,这是学习FPGA经常遇到的名词. 先贴出来时钟偏斜的定义: 时 ...
- 数字电路中时钟抖动 Jitter 和 偏移 Skew
系统时序设计中对时钟信号的要求是非常严格的,因为我们所有的时序计算都是以恒定的时钟信号为基准.但实际中时钟信号往往不可能总是那么完美,会出现抖动(Jitter)和偏移(Skew)问题. 所谓抖动(ji ...
- Canvas之translate,scale,rotate,skew
Canvas之translate,scale,rotate,skew Canvas大致可以分为三类: save,restore等与层相关的保存和回滚相关方法 scale,rotate,clipXXX等 ...
- PAT甲级1147 Heaps (30 分):[C++题解]堆、树的遍历、dfs、完全二叉树建树
文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:给定完全二叉树,判断是否是堆,需要区分大根堆,小根堆.后面是输出后序遍历. AC代码 #include<bits/stdc++. ...
- 怎么利用css调整区块大小,使用CSS3 transform:skew方法实现的倾斜区块分割
CSS 语言: CSSSCSS 确定 body { background: #FF7A2E; color: white; font-family: Open sans, Helvetica Neue; ...
最新文章
- 推荐5最佳免费图像注释工具
- HH的项链 (求区间内有多少个不同的数字)
- Eclipse打包工具 FatJAR
- Mapped Statements collection does not contain value for TaskMapper.selectByPrimaryKey
- 从零开始入门 K8s | K8s 的应用编排与管理
- 傅里叶变换处理音频c++_积分变换(1)——傅里叶级数
- 7 个让您需要渐进式 Web 应用程序做项目开发的理由
- mysql 1005 - can't create table_关于创建数据表报错一例(ERROR 1005 Can’t create table (errno: 121))...
- 匈牙利算法-指派问题、二分图问题等
- Java实现正整数数组的最小拼接数
- 算法工程师进化-基础理论
- hadoop远程调试
- 【NLP】第6章 使用 Transformer 进行机器翻译
- 常用的的身份证校验方法
- 关于消息队列的一些思考
- Python刷点击率,下载量代码
- Vue2积分商城PC端项目(六)
- 【matlab应用】:生成老电影海报
- STM32 W5500 OTA功能 - bootloader及app的设计和实现
- 玉石效果?——UnityShader学习笔记