《算法导论3rd第十九章》斐波那契堆

article/2025/8/29 14:32:50

前言

第六章堆排序使用了普通的二叉堆性质。其基本操作性能相当好,但union性能相当差。
在这里插入图片描述
对于一些图算法问题,EXTRACT-MIN 和DELETE操作次数远远小于DECREASE-KEY。因此有了斐波那契堆。

斐波那契堆结构

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

  • 每个结点x包含一个指向它父结点的指针x.p和一个指向它的某一个孩子的指针x.child。x的所有孩子被链接成一个环形的双向链表,称为x的孩子链表。
  • 孩子链表中的每个孩子y均有指针y.left和y.right,分别指向y的左兄弟和右兄弟。如果y是仅有的一个孩子,则y.left = y.right =y。
  • 结点x的孩子链表中的孩子数目储存在x.degree。
  • 布尔值属性x.mark指示结点x自从上一次成为另一个结点的孩子后,是否失去过孩子。
  • 通过指针H.min来访问一个给定的斐波那契堆H,该指针指向具有最小关键字的树的根结点,我们把这个结点称为斐波那契堆的最小结点。
  • 如果一个斐波那契堆H是空的,那个H.min为NIL。
  • H.n表示H中当前的结点数目。

可合并堆操作

创建一个新的斐波那契堆

创建一个空的H,Make-Fib-Heap分配并返回一个Fib对象H,其中H.n = 0和H.min = NIL,H中不存在树。

插入一个结点

直接将结点插入根连表中,如果是最小点则将H.min指向它
在这里插入图片描述

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 = xelseinsert x into H's root listif x.key < H.min.keyH.min = xH.n = H.n + 1

寻找最小结点

最小结点可通过H.min得到。

两个斐波那契堆的合并

将H1和H2的根链表链接,然后确定新的最小结点。之后,销毁H1和H2,表示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

抽取最小结点

  1. 将要抽取的最小结点子树都直串在根表中
  2. 合并所有degree相同的树,直到没有

在这里插入图片描述

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 = NILelseH.min = z.rightConsolidate(H)H.n = H.n - 1return zConsolidate(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]elseinsert 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

练习

2-1 给出 19-4(m)中的斐波那契堆调用FIB-HEAP-EXTRACT-MIN后得到的斐波那契堆

  1. 7的子树到根列表中
  2. 合并相同degree的树
    在这里插入图片描述

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

关键字减值

在这里插入图片描述

  • 首先,将"被减小节点"从"它所在的最小堆"剥离出来;然后将"该节点"关联到"根链表"中。 倘若被减小的节点不是单独一个节点,而是包含子树的树根。则是将以"被减小节点"为根的子树从"最小堆"中剥离出来,然后将该树关联到根链表中。
  • 接着,对"被减少节点"的原父节点进行"级联剪切"。
  • 最后,别忘了对根链表的最小节点进行更新。

所谓"级联剪切",就是在被减小节点破坏了最小堆性质,并被切下来之后;再从"它的父节点"进行递归级联剪切操作。
级联操作的具体动作则是:若父节点(被减小节点的父节点)的marked标记为false(默认为false),则将其设为true,然后退出。若为true,将父节点从最小堆中切下来(方式和"切被减小节点的方式"一样);然后递归对祖父节点进行"级联剪切"。
marked标记的作用就是用来标记"该节点的子节点是否有被删除过",它的作用是来实现级联剪切。而级联剪切的真正目的是为了防止"最小堆"由二叉树演化成链表。

Fib-Heap-Decrease-Key(H, x, k)if k > x.keyerror "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 = xCut(H, x, y)remove x from the child list of y, decrementing y.degreeadd x to the root list of Hx.p = NILx.mark = FALSECascading-Cut(H, y)z = y.pif z != NILif y.mark = FALSEy.makr = TRUEelseCut(H, y, z)Cascading-Cut(H, z)

删除一个结点

  1. 先将被删除节点的键值减少。减少后的值要比"原最小节点的值"即可。
  2. 取出最小节点即可。
Fib-Heap-Delete(H, x)Fib-Heap-Decrease-Key(H, x, -∞)Fib-Heap-Extract-Min(H)

增加关键字值

  1. 将增值节点的所有孩子放到根链表中
  2. 将增值节点放到根链表中,然后级联剪切

在这里插入图片描述

主要参考

《二项堆》
《斐波那契堆》
《斐波那契堆(一):起源》
《算法导论读书笔记(19)斐波那契堆》
《Fibonacci Heaps》


http://chatgpt.dhexx.cn/article/crawO7Ka.shtml

相关文章

斐波那契堆(Fibonacci heaps)

一&#xff1a;斐波那契堆 1&#xff1a;特性 斐波那契堆同二项堆一样,也是一种可合并堆。斐波那契堆的优势是&#xff1a;不涉及删除元素的操作仅需要O&#xff08;1&#xff09;的平摊运行时间&#xff08;关于平摊分析的知识建议看《算法导论》第17章&#xff09;。和二项…

3.3 斐波那契堆

结构 斐波那契堆的基础是可合并堆。 数据结构是一个森林。也就是N棵树。这点和二项堆一样。 这个结构没有二项堆那么多的要求。 Rank的概念,是子节点的数目 与二项堆不同的是&#xff0c;斐波那契堆的底层链表要成环&#xff0c;要双向链表。   而斐波那契堆的节点&#xff…

二叉堆/二项堆/斐波那契堆

二叉堆 二叉树 二叉树&#xff1a;是树的一种&#xff0c;主要的特点是二叉树的所有节点最多只有两个叶节点。除此之外没有别的要求完全二叉树&#xff1a;就是在二叉树当中&#xff0c;除了最后一层之外&#xff0c;所有层的节点都有满的&#xff0c;且最后一层的节点也是从…

斐波那契堆(Fibonacci heap)原理详解

前言 斐波那契堆(Fibonacci heap)是计算机科学中最小堆有序树的集合。它和二项式堆有类似的性质&#xff0c;但比二项式堆有更好的均摊时间。堆的名字来源于斐波那契数&#xff0c;它常用于分析运行时间。 堆结构介绍 基本术语介绍&#xff1a; 关键字&#xff1a;堆节点储存的…

斐波那契堆 - 解析与实现

概要 本章介绍斐波那契堆。和以往一样&#xff0c;本文会先对斐波那契堆的理论知识进行简单介绍&#xff0c;然后给出C语言的实现。后续再分别给出C和Java版本的实现&#xff1b;实现的语言虽不同&#xff0c;但是原理如出一辙&#xff0c;选择其中之一进行了解即可。若文章有…

算法导论 斐波那契堆

算法导论 斐波那契堆 定义 堆H 最小结点min&#xff1a;指向最小关键字key的根结点n表示当前堆中结点的个数 结点x 最小堆性质&#xff1a;每个结点的关键字key均大于等于父结点的关键字根链表&#xff1a;所有的根结点都通过left,right指针形成一个环形链表父类指针为p,左右兄…

斐波那契堆(Fibonacci heap)原理详解(附java代码实现)

前言 斐波那契堆(Fibonacci heap)是计算机科学中最小堆有序树的集合。它和二项式堆有类似的性质&#xff0c;但比二项式堆有更好的均摊时间。堆的名字来源于斐波那契数&#xff0c;它常用于分析运行时间。 堆结构介绍 基本术语介绍&#xff1a; 关键字&#xff1a;堆节点储存的…

斐波那契堆

斐波那契堆 作者&#xff1a; 大树先生 博客&#xff1a; http://blog.csdn.net/koala_tree GitHub&#xff1a;https://github.com/koalatree 2017 年 09 月 13 日 自《算法导论》. 斐波那契堆有两种用途&#xff1a;第一种&#xff0c;支持一系列操作&#xff0c;这些操作…

斐波那契堆(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…