数据结构-左式堆

《数据结构与算法分析》左式堆详解 前言:       这篇博客也是补上休假拉下的内容。。博客已经严重滞后了。。 我的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)的代价 二叉 阅读详情

相关推荐

告别Win11睡眠假死:深入解析Modern Standby S0与S3冲突及注册表修复方案

本文深入解析了Windows 11中Modern Standby(S0)与传统睡眠(S3)模式的冲突,该冲突是导致电脑睡眠后出现假死、断网等问题的根源。文章提供了通过修改注册表键值(PlatformAoAcOverride)强制启用稳定S3睡眠的终极修复方案,并附有详细诊断步骤与避坑指南,帮助用户彻底解决睡眠故障。

ol789012的博客 823

左倾堆 leftist heap

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

XFire的博客 528

Android逆向实战:通过smali/baksmali动态注入DEX逻辑

本文详细介绍了在无源码条件下对Android应用进行动态逻辑注入的实战方法。通过使用smali和baksmali工具对DEX文件进行反编译、修改与重打包,实现在目标方法中插入自定义代码(如日志打印),并分享了定位目标、处理寄存器、避免常见错误的实用技巧与避坑指南。

weixin_29008691的博客 365

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

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

weixin_33894640的博客 295

基于ST32 DAC7311数模转换器驱动代码及电路设计完整版

基于ST32的DAC7311模数转换器的电路设计及驱动代码完整版

qq_39626643的博客 3720

Unity3d SECTR 2019 从零开始了解(零)

插件刚下载下来,虽然从Demo里面看了下大致效果,但尝试使用的时候茫无头绪,因此决定一边读文档一边写下笔记。这个笔记会从最基本的名词概述开始一步一步到用法。 除非特别注明,所有内容都不是机翻,而是理解后自己翻译的。 翻译内容: 【零】API REFERENCE MANUAL第一章Documentation Core Concept 【一】 名词概述 CORE CORE是SECTR的核心,一个快速将 Sectors 和 Portals 加入到Unity中的工具,以及完整的源代码,可以构筑独特的功能。 VI

狗蛋在土里瑟瑟发抖 1502

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

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

进入python的世界-killeri 427

AnyLogic 8.8.3 最新版安装指南:从下载到配置的完整流程(附Java环境设置技巧)

本文提供了AnyLogic 8.8.3最新版从下载到配置的完整安装指南,重点解决了跨平台(Windows、macOS、Linux)部署中的常见问题。核心内容详细讲解了Java开发环境(JDK)的精准配置技巧,包括版本选择、系统环境变量设置与验证,确保为仿真建模工作奠定稳固基础。

efc1234567的博客 762

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

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

蛋蛋 283

点云配准SIFT+SI+RANSAC+ICP

Spin Image(SI)是一种用于点云数据描述的特征描述子,广泛应用于三维点云配准、识别和重建等领域。它能够捕捉点云中的局部几何信息,具有旋转不变性和部分平移不变性等优点,是一种非常强大的特征描述子。Spin Image是一种强大的点云特征描述子,具有旋转不变性、局部几何信息捕捉等优点,适用于点云配准、目标识别和三维重建等多个领域。通过合理选择局部区域、建立参考框架和计算描述子,可以充分利用Spin Image描述点云的特征,从而实现各种三维场景分析和处理任务。

点云兔子的博客 559

YOLOv11涨点改进 | 全网独家下采样改进、细节涨点篇 | TGRS 2025 | 引入PWD参数化小波下采样模块,减少下采样过程中小目标的关键细节丢失,即插即用,助力高效涨点发论文

本文提出了一种改进YOLOv11小目标检测性能的参数化小波下采样(PWD)模块。PWD通过小波变换保留目标细节信息,增强频率域特征表达,有效解决了传统下采样导致的小目标信息丢失问题。该模块采用双分支设计,结合自适应频率选择和空间补偿机制,在红外图像和低光场景中表现出更强的抗干扰能力。实验表明,PWD能显著提升YOLOv11对弱纹理和低对比度目标的检测精度,同时保持计算效率。文章详细介绍了PWD的结构原理、实现代码及在YOLOv11中的集成方法,为小目标检测提供了有效的改进方案。

Ai缝合怪、助力小伙伴高效发论文 235

转载:数据结构 左式堆

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

weixin_34409741的博客 84

innovus:sroute 双层follow pin的做法

根据std cellpower pin的层次可以分成两种情况。

m0_61544122的博客 2732

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

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

rp++ 501

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

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

左子树的学习

youqiangchi8541的博客 452

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

xitie8523的博客 724

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、付费专栏及课程。

余额充值