可并堆与二叉堆

本文探讨了在需要频繁合并操作且数据规模较大的情况下,二叉堆的局限性,并介绍了可并堆的概念。重点讲解了斜堆、左偏树、二项堆、配对堆和斐波那契堆等五种可并堆的定义、特点和操作时间复杂度。其中,二叉堆因其空间效率和编程简洁性而常见,但合并操作复杂度为O(n)。可并堆如斜堆的合并操作则更优。文章提供了各类型堆的合并伪代码和时间复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比较实用的堆有二叉堆(完全二叉树),因为其空间需求最小(可用数组实现),编程复杂度最低。

但是,在特殊情况时,需要常用合并操作并且n较大时,二叉堆的合并操作的复杂度是o(n),如果n是较大的值,可能是比较难以接受的,所以就有了可并堆。

本文主要学习可并堆的理论上的知识点。


1、二叉堆

定义:

二叉堆满足堆特性:
1)父结点的键值总是大于或等于(小于或等于)任何一个子结点的键值,且每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)
2)完全二叉树,结点i的儿子是2*i+1和2*i+2,父亲是i/2(下标从0开始);
3)当且仅当它满足以下两个条件之一时,才能称之为堆:
3-1)a[i]<=a[i*2+1]且a[i]<=a[i*2+2](即小根堆,节点的值不大于两个儿子的值)
3-2)a[i]>=a[i*2+1]且a[i]>=a[i*2+2](即大根堆,节点的值不小于两个儿子的值)


各种操作的时间复杂度

1)构建O(n)
2)插入O(logn)
3)取最小结点O(1)
4)删除最小结点O(logn)
5)删除任意结点O(logn)
6)合并O(n)


2、可并堆

定义

1)可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),
还支持一个额外的操作——合并操作:
2)H ← Merge(H1,H2)
Merge() 构造并返回一个包含H1和H2所有元素的新堆H。

各种可并堆:
(1)斜堆(SkewHeap)
(2)左偏树(LeftistTree)
(3)二项堆(BinomialHeap)
(4)配对堆(PairingHeap)
(5)斐波那契堆(FibonacciHeap)
各种操作的复杂度比较:


(1)斜堆( SkewHeap)

满足堆性质:
(1)父结点的键值总是大于或等于(小于或等于)任何一个子结点的键值
(2)每个结点的左子树和右子树都是斜堆
(3)结构看起来与普通的二叉树类似



合并A,B链两个斜堆

合并操作:merge( A, B)
(1)将以A,B为根结点的两个斜堆合并,再返回合并后的新斜堆的根结点。
(2)小根堆为例:
假设A.key <=B.key就将A的右子树与B合并(递归进行)当做A的新的右子树。然后交换A的左右子树。
(3)斜堆的插入\删除操作都是建立在合并操作的基础上的。
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值