可并堆与二叉堆

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

但是,在特殊情况时,需要常用合并操作并且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)小根堆为例&#x
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值