算法学习笔记2--斐波那契堆

1,操作时间复杂度



2,基本结构


说明:

1)由多个最小堆组成

2)每个最小堆的根节点构成一个双向链表,称为根链表

3)每个最小堆内同级的节点构成一个双链表。

4)每个非根节点保存父节点指针和任意一个孩子节点指针。

5)min 指向根链表key值最小的节点,即堆的最小节点。

2,基本操作

1)add/insert 节点:

直接插入根链表,并更新min值。O(1) 的时间复杂度。


2)合并两个堆

合并连个堆的根链表,并更新min值。O(1) 的时间复杂度。


3)提取最小值

3.1, 将min的子节点并入根链表,返回min值

3.2, 重新整理根链表,如果根节点x与根节点y有相同的孩子数(假设x.key < y.key3),则将y从根链表移除并加入到x的孩子节点链表。

3.3, 重复3.2直到所有根节点的孩子数都不相同

3.4, 更新min值




4)减小节点关键字

4.1 若x为根节点或x新的key比父节点大,则直接保存x的key为新值

4.2 否则将x的key更新为新值,并将x并入到根节点链表

4.3 设x原父节点为y,若y曾经失去过孩子节点(y.mark == true)则将y并入到根节点链表。继续查找y的父节点,直到根。

否则若y未曾失去过孩子节点(y.mark == false)则set y.mark =true,结束查找。


注:4.3 步的目的是为了保证堆操作的摊还复杂度


5)删除一个节点

5.1 调用减小节点的key方法, 将待删除节点key值设为一个小于min的值。

5.2 调用提取最小节点方法。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值