数据结构-左式堆

《数据结构与算法分析》左式堆详解 前言:       这篇博客也是补上休假拉下的内容。。博客已经严重滞后了。。 我的github: 我实现的代码全部贴在我的github中,欢迎大家去参观。 https://github.com/YinWenAtBIT 介绍: 定义:      左式堆(Leftist Heaps)又称作最左堆、左倾堆,是计算机语言中较为常用的一个 阅读详情

左式堆:同二叉堆一样具有结构性和堆序性。惟一的区别是:左式堆不是理想平衡的,而实际上是趋于不平衡的。

零路径长(NPL(x)):从节点x到一个没有两个儿子节点的最短路径长。

左式堆要求对于堆中的每一个节点x,左儿子的零路径长至少与右儿子的零路径长一样大。

左式堆的结构声明:

struct treeNode;
typedef struct treeNode *priorityQueue;


struct treeNode
{
	int element;
	priorityQueue left;
	priorityQueue right;
	int npl;
};


priorityQueue initialize(priorityQueue h);
void swapChildren(priorityQueue h);
priorityQueue merge(priorityQueue h1, priorityQueue h2);
static priorityQueue merge1(priorityQueue h1, priorityQueue h2);
priorityQueue insert1(int x, priorityQueue h);
int isEmpty(priorityQueue h);
priorityQueue deleteMin1(priorityQueue h);
void printQueue(priorityQueue h);

合并左式堆的驱动例程:
priorityQueue merge(priorityQueue h1, priorityQueue h2)
{
	if (h1 == NULL)
		return h2;
	if (h2 == NULL)
		return h1;
	if (h1->element < h2->element)
		return merge1(h1, h2);
	else
		return merge1(h2, h1);
}

合并左式堆的实际例程:

void swapChildren(priorityQueue h)
{
	priorityQueue r = h->left;
	h->left = h->right;
	h->right = r;
}


static priorityQueue merge1(priorityQueue h1, priorityQueue h2)
{
	if (h1->left == NULL)
		h1->left = h2;
	else
	{
		h1->right = merge(h1->right, h2);
		if (h1->left->npl < h1->right->npl)
			swapChildren(h1);
		h1->npl = h1->right->npl + 1;
	}
	return h1;
}

插入例程:

priorityQueue insert1(int x, priorityQueue h)
{
	priorityQueue singleNode;
	singleNode = (struct treeNode *)malloc(sizeof(struct treeNode));
	if (singleNode == NULL)
		cout << "Out of space!" << endl;
	else
	{
		singleNode->element = x;
		singleNode->npl = 0;
		singleNode->right = singleNode->left = NULL;
		h = merge(singleNode, h);
	}
	return h;
}

DeleteMin例程:

int isEmpty(priorityQueue h)
{
	if (h == NULL)
		return 1;
	else
		return 0;
}


priorityQueue deleteMin1(priorityQueue h)
{
	priorityQueue leftHeap, rightHeap;
	if (isEmpty(h))
	{
		cout << "Queue is null!" << endl;
		return h;
	}
	leftHeap = h->left;
	rightHeap = h->right;
	free(h);
	return merge(leftHeap, rightHeap);
}


Leftist Heaps 习题解 Leftist Heaps (最左堆)是一种用于快速合并的数据结构,是堆的一种变种。它的合并操作只需花费O(logN)的代价。 对于二叉堆来说,两个堆合并是非常昂贵的操作,这将耗费O(N)的时间,与重新建堆的时间相同。为了应对优先队列的Merge操作,我们从本篇开始将介绍包括最左堆(又叫左式堆)在内的三种数据结构。 本篇将介绍相关题目。 证明 二叉堆的合并需要耗费O(N)的代价 二叉 阅读详情

相关推荐

使用Python开发TreeATE的测试脚本常见问题

ImportError: No module named py_compile 找不到 DevLangPython3.dll 以上2个问题都是没有安装正确的Python,当前TreeATE依赖32位Python 2.7版本,暂时不支持Python 3以上版本

蓝白云的专栏 1033

左倾堆 leftist heap

左倾堆(左偏树)和之前记录过的二叉堆一样,是堆的一种;和普通的二叉堆不同,它是一种可合并堆。可合并堆相比于普通的二叉堆在对两个堆进行合并的操作上具有很大的优势:对于基本的二叉堆合并,时间复杂度为O(n), 而对于可合并堆,其时间复杂度为O(log2n). ...

XFire的博客 528

11. TI MSPM0G3507 DMA传输实战:ADC数据自动搬运与电压采集

本文以TI MSPM0G3507为例,详细讲解了如何利用DMA(直接存储器访问)实现ADC数据的自动搬运与电压采集。通过实战演示,解放CPU资源,提升系统实时性与效率,适用于电赛备赛及嵌入式开发中的数据采集场景。

weixin_42465140的博客 132

纸上谈兵: 左倾堆 (leftist heap)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   我们之前讲解了堆(heap)的概念。堆是一个优先队列。每次从堆中取出的元素都是堆中优先级最高的元素。 在之前的文章中,我们基于完全二叉树(complete binary tree)实现了堆,这样的堆叫做二叉堆(binary heap)。binary heap有一个基本要求...

weixin_33894640的博客 295

Synology File Station 官方 API 指南总结(中文版)

本文总结了Synology File Station官方API指南的核心内容,详细介绍了如何通过HTTP/HTTPS请求与DSM系统交互实现文件管理功能。主要内容包括: 基础API操作流程:从获取API信息、登录认证到执行请求和登出的完整工作流 请求构造与响应解析:JSON格式的请求参数处理和响应结果分析 关键API功能分类: 文件信息获取(List/Info) 文件搜索(Search) 收藏夹管理(Favorite) 缩略图生成(Thumb) 目录大小计算(DirSize) 文件上传(Upload)等 错

weixin_46001686的博客 2462

python控制caxa模块_CAXA二次开发实用手册.doc

您所在位置:网站首页 > 海量文档&nbsp>&nbsp汽车/机械/制造&nbsp>&nbsp机械软件CAXA二次开发实用手册.doc119页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。 下载提示1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。2.该文档所得收...

weixin_39990819的博客 1766

递归结合左式堆的一个具体说明!

关于递归的一点说明,今天看到左式堆合并操作时对递归突然有了很好的理解,就结合《数据结构和算法分析》第一章的关于递归的说明,好好理解了下递归(如何使用递归) 当然,有些话是引用书本的 首先我们来说一下递归的四条基本法则(下面会结合例子说明的): 重点内容 一、基准情形:在递归实现中一定要有某些基准情形,它无需递归就可以实现。 二、不断推进:对于那些需要用递

进入python的世界-killeri 427

PnP 单目相机位姿估计(二):solvePnP利用二维码求解相机世界坐标

前言 原理简介 输入参数准备 1 objectPoints特征点世界坐标 2 imagePoints特征点在摄像头下的像素点坐标 3cameraMatrixdistCoeffs内参矩阵和畸变矩阵 相机世界坐标的求解 1求世界坐标中的点在相机坐标系下的坐标 2求相机在世界坐标中的坐标 3效果求解相机在世界坐标系下的坐标点 4求解代码1.前言  很多时候,当我们利用单目相机获取图像时,往往只能获取图像中

cocoaqin的博客 5万+

二十三、数据结构之左式堆

不想进行过多的解释。 左式堆:顾名思义,左树一定大于右树,就这一个定理,时刻满足这个定理就是坐式堆,再加个从上到下,权重逐渐递减就是个优先坐式堆。手动滑稽。。。。。。。。。。。。。 直接上代码了,自己研究吧,蛮简单的,手动狗头。。。。。。。。。。 #include <stdio.h> #include <stdlib.h> //定义数据类型 typedef int...

蛋蛋 283

FPGA工程师面试——FPGA基础知识24题

线与逻辑是两个输出信号相连可以实现与的功能。在硬件上,要用OC门(集电极开路与非门)来实现,由于不用OC门可能使灌电流过大,而烧坏逻辑门,因此在输出端口应加一个上拉电阻。

FPGA/MATLAB学习教程/源码/项目合作开发 1086

【AI智能体】Coze 搭建个人旅游规划助手实战详解

Coze 制作旅游规划助手机器人实战详解

congge 4607

转载:数据结构 左式堆

简介 设计一种堆结构像二叉堆那样高效的支持合并操作而且只使用一个数组似乎很困难。原因在于,合并似乎需要把一个数组拷贝到另一个数组中去,对于相同大小的堆,这将花费O(N)。正因为如此,所有支持高效合并的高级数据结构都需要使用指针。 像二叉堆那样,左式堆也有结构性和堆序性。不仅如此,左式堆也是二叉树,它和二叉堆之间的唯一区别在于:左式堆不是理想平衡的,而实际上是趋向于非常不平衡。 左式堆性质 ...

weixin_34409741的博客 84

如何正确的计算两个角度的角度差?

这一步是必要的,因为它确保了无论a相对于b是在逆时针方向还是顺时针方向,d2总是正确地反映出绕圆相反方向的角度差。这样,当函数进行最后的比较时,它能够准确地比较两个方向的旋转路径并选择最短的一个。

小秋 AI SLAM 入门实战教程 4137

蒟蒻的ACM数据结构(五)-左式堆

左式堆一.序二.用处三.基本概念四.合并五.代码实现(一).结构(二).合并(三).插入(四).删除(五).样例代码例题(hdu 1512) Monkey KingProblem DescriptionInputOutput解析 一.序 强烈安利<数据结构与算法分析-c语言描述>这本书!!! 更好的讲解可阅读该书.或者看这位大佬的博客%% 二.用处 这个左式堆啊~直接当作可以合并的二叉...

rp++ 501

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构与算法分析---左式堆的总结

左子树的学习

youqiangchi8541的博客 452

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数据结构笔记(七)——左式堆/左偏树(leftist heap)(2)

前面二叉堆实现了优先队列基本的插入和删除最小元操作,但如果想要将两个堆合并的话就不太容易了,我们要把一个数组里的数据拷贝到另一个数组,如果数组1和数组2大小相同,那么合并操作的时间就是O(N)。果然合并还是需要指针呀,所以我们提出了左式堆,但是注意指针操作实际会比乘除运算更加耗费时间。 左式堆(Leftist Heap)也有结构和有序性。左式堆的有序性和二叉堆一样,父亲小于所有的儿子。它不再是用...

xitie8523的博客 724

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java数据结构与算法解析(十五)——左式堆

Java数据结构与算法解析(十五)——左式堆 左式堆概述 左式堆(leftist tree 或 leftist heap),又被成为左偏树、左倾堆,最左堆等。  它和二叉堆一样,都是优先队列实现方式。当优先队列中涉及到”对两个优先队列进行合并”的问题时,二叉堆的效率就无法令人满意了,而本文介绍的左式堆,则可以很好地解决这类问题。 上图是一颗左倾树,它的节点除了和二叉

huangshulang1234的博客 327

左式堆(数据结构篇)

讲述数据结构中的左式堆

hellmorning的博客 923

数据结构--左式堆的思想和代码

左式堆也是实现优先列队的一种数据结构,和二叉堆一样,左式堆也具有堆序性和结构性。 堆序性: 一个节点的后裔都大于等于这个节点。 结构性:左式堆也是二叉树,和二叉堆的唯一区别在于左式堆不是理想平衡的,实际上是趋于非常不平衡,对于堆中每一个节点X,左儿子的零路径长至少与右儿子的零路径长一样大,零路径长Npl的定义为:节点到一个没有两个儿子的节点的最短...

weixin_30535167的博客 114

数据结构 第十章 优先级队列(完全二叉堆 左式堆)

数据结构 第十章 优先级队列 循优先级访问:按照任务的优先级来决定任务的处理顺序

CptOctopus的博客 932

数据结构--二叉堆、d堆、左式堆和斜堆

本文是转载,出自:http://blog.csdn.net/yangtrees/article/details/8252760点击打开链接 实现优先队列结构主要是通过堆完成,主要有:二叉堆、d堆、左式堆、斜堆、二项堆、斐波那契堆、pairing 堆等。   1. 二叉堆   1.1. 定义 完全二叉树,根最小。 存储时使用层序。   1.2.

never give up的博客 1578

数据结构之左式堆java实现

优先队列之左式堆 什么叫做左式堆呢?他就是跟二叉堆一样具有结构性和有序性,也就是说它是基于二叉堆的一个提升,他们的唯一区别就是左式堆是非常不平衡的。左式堆是一个有效支持合并操作的数据结构。 关于二叉堆可以看我之前写的博文二叉堆的实现 左式堆的性质 首先我们要知道,左式堆有一个npl值null path length,也就是任意节点到一个没有两个孩子节点的最短路径。 而他的性质则是 对于任意一个节点左子树的npl值至少等于右子树的npl值。也就是说左孩子的npl大于等于右孩子的npl值。 节点具有一个孩子节点

TanGBx的博客 214

数据结构与算法-java实现左式堆

左式堆最难理解的就是合并操作了,实际就是记住一句话:根植大的堆和根植小的堆的右子树合并。可参考下图:(以下图片来自于https://blog.csdn.net/yangtrees/article/details/8252760) (1)H1只有一个节点 (2)H1无右子节点 (3)H1有右子节点 ...

liyangxueit的博客 203

【数据结构】优先队列专题 左式堆

文章目录1. 左式堆概述2. 左式堆性质3. 左式堆操作和代码实现(1) 合并操作(2) 插入操作(3) 删除最小值操作 1. 左式堆概述 为了有效支持合并操作,即以 o(N)o(N)o(N) 时间进行 Merge ,我们需要使用动态的链接结构或者静态链表。如果只使用数组形式的堆结构,在进行合并时光拷贝一个数组到另一个数组中,就将花费 Θ(N)\Theta(N)Θ(N) 的时间。 左式堆 (leftist tree, leftist heap ),或者说左偏堆、左偏树,是一种优先队列实现方式,属于可并堆(

memcpy0的博客 2706

数据结构之左式堆的实现

左式堆是一种很有意思的二叉树,他与二叉堆即优先队列一样,具有堆序性质,唯一的区别在于他并非完全的平衡,而是偏左的,对任意一个节点x,左儿子的零路径长至少与右儿子的零路径长一样大,所谓的零路径长是从x到一个不具有两个儿子的节点的最短路径长:  如下: 只有左边的才是左式堆,因为左树的左儿子与右儿子的零路径长一样大,右边的不是左式堆,因为1*的左儿子的零路径长为0,而右儿子的零路径

alop or 导演 的专栏 1830

为什么左式堆总向左倾斜?图解优先队列的冷门数据结构

本文深入解析了左式堆这一为高效合并而设计的优先队列数据结构。通过图解和原理剖析,揭示了其刻意向左倾斜的秘密:利用零路径长和左偏性质,将合并操作的时间复杂度优化至O(log N)。文章对比了其与经典平衡树的差异,并提供了从零实现的实战代码,帮助开发者理解在需要频繁合并队列的场景下如何做出最优选择。

weixin_29219189的博客 321
上一篇: 数据结构-二叉堆
下一篇: 算法导论-图的搜索算法之深度优先搜索和广度优先搜索
hola_f
博客等级 码龄10年 28粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值