斐波那契堆

article/2025/8/29 17:35:56

斐波那契堆


作者: 大树先生
博客: http://blog.csdn.net/koala_tree
GitHub:https://github.com/koalatree
2017 年 09 月 13 日


自《算法导论》.

斐波那契堆有两种用途:第一种,支持一系列操作,这些操作构成了所谓的“可合并堆”。第二种,斐波那契堆的一些操作可以在常数摊还时间内完成。

可合并堆的两种实现方式下各操作的运行时间。在操作时堆中的项数用n表示。

这里写图片描述

一、斐波那契堆结构

一个斐波那契堆是一系列具有最小堆序的有根树的集合。也就是说,每棵树均遵循最小堆性质:每个结点的关键字大于或等于它的父结点的关键字。

这里写图片描述

结点属性

  • x.p:指向其父结点的指针;
  • x.child:指向其某一个孩子结点的指针;x结点所有的孩子链接成一个环形双向链表,称为孩子链表;
  • y.left、y.right:每个孩子y包含,分别指向y的左兄弟和右兄弟,若只有一个孩子,则y.left=y.right=y;
  • x.degree:结点x的孩子链表中的孩子树木;
  • x.mark:结点x自从上一次成为另一个结点的孩子后,是否失去过孩子;
  • H.min:用来访问给定的斐波那契堆,指向具有最小关键字的树的根结点,称为最小结点;
  • H.n:表示H中当前结点数目。

势函数

使用势方法来分析斐波那契堆操作的性能。

  • t(H) :表示H中跟链表中树的数目;
  • m(H) :表示H中已标记的结点数目;
  • 势函数 Φ(H)
    Φ(H)=t(H)+2m(H)

最大度数

在一个n个结点的斐波那契堆中任何结点的最大度数都有上界 D(n)lgn .

二、可合并堆操作

1. 创建一个新的斐波那契堆

过程分配并返回一个斐波那契堆对象H,其中H.n=0和H.min = NIL,H中不存在树。

由于 t(H)=0,m(H)=0 ,空斐波那契堆的势为 Φ(H)=0 ,因此创建新堆的摊还代价等于他的实际代价 O(1)

2. 插入一个结点

Fib_heap_insert(H, x)x.degree = 0x.p = NILx.child = NILx.mark = FALSEif H.min == NILcreate a root list for H containing just xH.min = xelse insert x into H's root listif x.key < H.min.keyH.min = xH.n = H.n + 1

这里写图片描述

t(H)=t(H)+1,m(H)=m(H) ,则增加的势能为1,实际代价为 O(1) ,摊还代价为 O(1)+1=O(1) .

3. 寻找最小结点

通过指针H.min得到。可以在 O(1) 的实际代价内找到最小结点。

4. 两个斐波那契堆的合并

合并斐波那契堆 H1,H2 ,销毁这两个堆。

Fib_heap_union(H1, H2)H = Make_fib_heap()H.min = H1.minconcatenate the root list of H2 with the root list of Hif (H1.min == NIL) or (H2.min /= NIL and H2.min.key < H1.min.key)H.min = H2.minH.n = H1.n + H2.nreturn H

势函数变化为0,所以摊还代价等于实际代价 O(1)

5. 抽取最小结点

Fib_heap_extract_min(H)z = H.minif z /= NILfor each child x of zadd x to the root list of Hx.p = NILremove z from the root list of Hif z == z.rightH.min = NILelse H.min = z.rightConsolidate(H)H.n = H.n - 1return z

以上代码用到的合并(Consolidating)H根链表的操作,通过调用Consolidating(H)来减少斐波那契堆中树的数目。

过程重复执行以下步骤:

  • 在根链表中找到两个具有相同度数的根x和y,其中,x.key <= y.key;
  • 把y链接到x:从根链表中移除y,调用Fib_heap_link过程,使y称为x的孩子,该过程将x.degree属性增加1,并清除y上的标记。

使用辅助数组 A[0..D(H.n)] 记录根结点对应的度数的轨迹。如A[i] = y,那么当前的y是一个具有y.degree = i的根。

Consolidate(H)let A[0..D(H.n)] be a new arrayfor i = 0 to D(H.n)A[i] = NILfor each node w in the root list of Hx = wd = x.degreewhile A[d] /= NILy = A[d]  #another node with the same degree as xif x.key > y.keyexchange x with yFib_heap_link(H, y, x)A[d] = NILd = d + 1A[d] = xH.min = NILfor i = 0 to D(H.n)if A[i] /= NILif H.min == NILcreate a root list for H containing just A[i]H.min = A[i]else insert A[i] into H's root listif A[i].key < H.min.keyH.min = A[i]
Fib_heap_link(H, y, x)remove y from the root list of Hmake y a child of x, incrementing x.degreey.mark = FALSE

这里写图片描述

这里写图片描述

抽取最小结点的摊还代价为 O(D(n))=O(lgn) .

三、关键字减值和删除一个结点

1. 关键字减值

摊还时间: O(1) .

Fib_heap_decrease_key(H, x, k)error "new key is greater than current key"x.key = ky = x.pif y /= NIL and x.key < y.keyCut(H, x, y)Cascading_cut(H, y)if x.key < H.min.keyH.min = x
Cut(H, x, y)remove x from the child list of y, decrementing y.degreeadd x to the root list of Hx.p = NILx.mark = FALSE
Cascading_cut(H, y)z = z.pif z /= NILif y.mark == FALSEy.mark = TRUEelse Cut(H, y, z)Cascading_cut(H, z)

斐波那契堆中规定,某个结点x一旦失掉第二个孩子,就切断x与其父结点的链接,是它称为一个新的跟。

所以,如果切掉的结点是其父结点的第二个孩子,则需要进行一次级联切断(cascading cut)。

过程示意图:

这里写图片描述

2. 删除一个结点

摊还时间: O(D(n))=O(lgn) .

Fib_heap_delete(H, x)Fib_heap_decrease_key(H, x, -inf)Fib_heap_extract_min(H)

O(1)+O(D(n))=O(D(n))=O(lgn) .


http://chatgpt.dhexx.cn/article/9gs0FZuT.shtml

相关文章

斐波那契堆(Fibonacci Heap)

也许我们每个人都知道斐波那契数列&#xff08;Fibonacci sequence&#xff09;。即这样一个数列&#xff1a;1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144...,如果我们用伪代码比表示: int FibonacciSequence(int n){if (n 1 || n 2) {return 1;}return FibonacciSequence(n …

斐波那契堆(一)之 图文解析 和 C语言的实现

出自&#xff1a;http://www.cnblogs.com/skywang12345/p/3659060.html 斐波那契堆(一)之 图文解析 和 C语言的实现 概要 本章介绍斐波那契堆。和以往一样&#xff0c;本文会先对斐波那契堆的理论知识进行简单介绍&#xff0c;然后给出C语言的实现。后续再分别给出C和Java版本…

斐波那契堆的C++实现

本文改编自《算法导论》第三版第19章&#xff1a;斐波那契堆。文中代码为书中伪代码的C实现&#xff0c;如有疏漏还请指出。 1.斐波那契堆的结构 斐波那契堆是一种可并堆&#xff0c;它支持以下操作&#xff1a; ( 1 ) (1) (1)在 O ( 1 ) O(1) O(1)时间内插入元素、获取最小…

常见电子元器件检测方法。——Arvin

电子设备中使用着大量各种类型的电子元器件&#xff0c;设备发生故障大多是由于电子元器件失效或损坏引起的。因此怎么正确检测电子元器件就显得尤其重要&#xff0c;这也是电子维修人员必须掌握的技能。我在电器维修中积累了部分常见电子元器件检测经验和技巧&#xff0c;供大…

电工电子复习题

1、应用叠加定理时&#xff0c;理想电压源不作用时视为______&#xff0c; 理想电流源不作用时视为____。 2、电容元件具有“通_____隔_____”的特性&#xff0c; 电感元件具有通___阳___ ”的特性&#xff0c;。 3、已知:“u 60sin(628t -135度)(v),则其有效值为____V,角频率为…

我的元器件入门

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 元器件 前言一、电阻器1、什么是电阻器2、电阻的标示方法和测量方法3、电阻的特性4、基本参数5、电阻的功能 二、电容器1、什么是电容&#xff1f;组成&#xff0c;基本参数&…

2023年天津中德应用技术大学专升本机械电子工程专业考试大纲

天津中德应用技术大学 机械电子工程专业&#xff08;高职升本科&#xff09; 2023年专业基础考试大纲 备注&#xff1a;考试题型&#xff1a;填空题、选择题、判断题、问答题、分析题、设计与计算题 《机械设计基础》主要知识点 第一部分常用机构 一、平面机构运动分析 知…

2021中级维修电工证考试题库2021职业技能鉴定

题库来源:特种作业模考题库小程序 1.三相负载作Y接时,无论负载对称与否,线电流总等于相电流。 √ 2.双向晶闸管是( )半导体结构。 B A.四层 B.五层 C.三层 D.二层 3.符合有“0”得“0”,全“1”得“1”的逻辑关系的逻辑门是( )。 B A.或门 B.与门 C.非门 D.或非门 4.示波…

2018第八届至2022年第十三届蓝桥杯单片机开放与设计省赛客观题及简解整理

前言&#xff1a; 由于本人马上要参加第十四届蓝桥杯单片机设计与开发的省赛了&#xff0c;在对客观题复习两轮后&#xff0c;发现效率是比较低的&#xff0c;因此整理了2018至2022年的省赛客观题&#xff0c;将大概的考点划分三部分&#xff0c;这样可以更加系统的复习其内容。…

晶体管频率特性——高频等效模型、频率特性、π模型的单向化

晶体管高频等效模型 通过之前的定性分析得出在高频情况下晶体管结电容将对信号传输带来较大影响。之前的 h 参数等效模型没有考虑结电容的影响&#xff0c;因此不再适用&#xff0c;此时要用新的模型来反映晶体管的结电容&#xff0c;这就是高频等效模型。 此时从晶体管的实际…

[渝粤教育] 郑州航空工业管理学院 电工电子技术基础 参考 资料

教育 -电工电子技术基础-章节资料考试资料-郑州航空工业管理学院【】 小节测试 1、【判断题】任何一个完整的电路都必须有电源、负载和中间环节三个基本部分组成。 A、正确 B、错误 参考资料【 】 2、【判断题】电路的作用是对电能进行传输、分配和转换&#xff1b;而对电信号进…

服务于期末考试的计算机硬件基础资料

电路的基本概念和基本定律 电流和电路模型 理想元件、理想电路、集总参数元件、集总参数电路 集总元件&#xff1a; 当电路器件的尺寸远小于电路最高工作频率所对应的波长时&#xff0c;可以认为元件的参数“集总”于一个点上&#xff0c;形成所谓的集总参数元件。 理想元件&am…

您需要了解的跨阻放大器——第1部分

跨阻放大器(TIA)是光学传感器(如光电二极管)的前端放大器,用于将传感器的输出电流转换为电压。跨阻放大器的概念很简单,即运算放大器(op amp)两端的反馈电阻(RF)使用欧姆定律VOUT= I RF 将电流(I)转换为电压(VOUT)。在这一系列博文中,我将介绍如何补偿TIA,及如…

小白的模拟电路初步学习20日打卡(11)

放大电路分析 一.基本共射放大电路的波形分析 输入电压。并且Ic等于βIb&#xff0c;所以本图可以表示Ic动态信号驮载在静态工作点上变化方向与之前的IbIc不同&#xff0c;但是是有关联的&#xff0c;即与其反向。 而这同时也是电压输出波形&#xff0c;所以可知共射放大电路…

8.1 正弦波振荡电路(1)

正弦波振荡电路是在没有外加输入信号的情况下&#xff0c;依靠电路自激振荡而产生正弦波输出电压的电路。它广泛地应用于测量、遥控、通讯、自动控制、热处理和超声波电焊等加工设备之中&#xff0c;也作为模拟电子电路的测试信号。 一、概述、 1、产生正弦波振荡的条件 在负…

【长篇肝文7万字】模电/数电/单片机/计算机组成原理/电力电子常见笔试/面试题(合集)未完更新ing

目录 一、模拟电子电路 1、基尔霍夫定理的内容 2、描述反馈电路的概念&#xff0c;列举它们的应用。 2.1 反馈的定义&#xff1a; 2.2 反馈的分类&#xff1a; 2.2.1 按反馈的效果分&#xff1a; 2.2.2 按反馈量的类型分&#xff1a; 2.3 负反馈电路 2.3.1 负反馈电路…

反相、同相比例运算电路与基尔霍夫电流定律的关联分析

基尔霍夫电流定律&#xff08;KCL&#xff09; 在任一瞬间&#xff0c;流向任一结点的电流等于流出该结点的电流。 At any given moment, the current flowing into any node is equal to the current flowing out of it. 即&#xff1a; 或&#xff1a; 反相比例运算电路…

【电路与电子技术】笔记 (完结)

前言 是自己复习的笔记。截图是老师的课件。 大标题按章节来分。 跳过了很多东西。 2021.11.2回来补充&#xff0c;考完了&#xff0c;谢谢老师的4.0&#xff1b; 第一章 1.电路和电路模型 集总参数电路模型&#xff1a; 当实际电路的尺寸远小于其使用时最高工作频率所对应…

模电笔记4 半导体三极管及放大电路基础

4.1半导体三极管 4.1.1BJT的结构简介 结构特点&#xff1a; 、、- 表示掺杂浓度的高低 4.1.2放大状态下BJT的工作原理 发射结正偏&#xff0c;发射区向基区注入载流子&#xff0c;基区有了大量与原基区少数载流子相同极性的载流子&#xff0c;从而集电区收集到大量载流子&am…

双极型晶体管及其放大电路

双极型晶体管及其放大电路 半导体基本特性.双极型晶体管结构与工作原理工作组态与性质 放大电路放大电路基础知识基本共射放大电路的工作原理与分析方法图解法分析:等效电路法 静态工作点稳定问题稳定原理静态工作点计算交流指标的计算 晶体单管放大电路三种组态共集放大电路共…