高级数据结构—斐波那契堆与二项堆详细介绍

article/2025/8/29 14:36:48

在这里插入图片描述

斐波那契堆与二项堆

        • 二项堆请点击这里👈
  • 数据结构与堆
  • 斐波那契堆
    • 概述
    • 结构
    • 实现
    • 符号定义
    • 插入结点
    • 合并
    • 抽取最小结点
    • 分析
    • Decrease Key
      • 第一种情况
    • 删除
    • 最大度数的界

二项堆请点击这里👈

数据结构与堆

下图列出了小顶堆在各种数据结构(链表、二叉堆、二项堆、斐波那契堆、松弛堆)的实现下,各种基本操作的时间复杂度
在这里插入图片描述

斐波那契堆

在这里插入图片描述

概述

  • 斐波那契堆历史:Fredman和Tarjan(1986)
    1. 巧妙的数据结构和分析
    2. 原始动机: O ( m + n log ⁡ n ) O(m+n \log n) O(m+nlogn)最短路径算法,也导致了更快的MST算法,加权二分匹配
    3. 仍然领先于它的时代
  • 斐波那契堆直觉:
    1. 类似于二项式堆,但结构不太复杂
    2. 减少键和联合运行时间 O ( 1 ) O(1) O(1)(均摊时间复杂度)
    3. “懒惰”联合
  • 斐波那契堆是以斐波那契堆数命名的,用于运行时间分析。

结构

在这里插入图片描述

  • 最小堆有序树集

实现

在这里插入图片描述

  • 每个结点都有一个指向父结点的指针和指向它任意一个孩子结点的指针。孩子结点在一个循环的双链接列表中链接在一起:可以快速拼接子树
  • 所有树的根在一个循环的双链接列表中链接在一起:合并操作更快
  • 有一个指向最小根结点的指针:快速找到最小值结点

符号定义

  • D e g r e e [ x ] Degree[x] Degree[x] = x x x结点的度
  • D ( n ) D(n) D(n) = 斐波那契堆中所有结点最大的度数
  • M a r k [ x ] Mark[x] Mark[x] = 结点 x x x的标记(黑色或灰色)
  • t ( H ) t(H) t(H) = H H H根链表中树的数目
  • m ( H ) m(H) m(H) = H H H中已标记的结点数目
  • Φ ( H ) \Phi(H) Φ(H) = t ( H ) + 2 m ( H ) t(H) + 2m(H) t(H)+2m(H)= 斐波那契堆的势函数

插入结点

在这里插入图片描述

  1. 创建一个新的单例树
  2. 添加到最小指针的左侧
  3. 更新最小指针
    • 时间复杂度: O ( 1 ) O(1) O(1)

合并

在这里插入图片描述

  1. 连接两个斐波那契堆
  2. 根列表是循环的双链表
    • 连接两个根链,更新最小值结点
    • 摊还时间复杂度为 O ( 1 ) O(1) O(1)

示例
在这里插入图片描述在这里插入图片描述

抽取最小结点

在这里插入图片描述

  • 删除最小结点并把它的孩子结点链入根链
  • 合并根链中相同度数的树

示例这里是引用
删除键值为3的根结点后将它的孩子结点链入根链在这里插入图片描述
有一个0~3的数组表示当前堆中从0到最大度数,这个数组用于记录当前存在的度数,从而寻找相同度数的树
删除3后指针H.min指向根链中除3以外的某个根结点,没必要一定是新的最小结点,这里指针向右移动(双向链表,也可以指向17)
这里新的最小结点指向7,同时度数数组记录度数1

在这里插入图片描述
指针向右移,记录一个度数为2
在这里插入图片描述
继续右移找到一个度为0
在这里插入图片描述
右移找到相同度数0,合并两个度数为0的树,这里将较大值合并为较小值的子树(最小堆性质)
在这里插入图片描述
合并后得到一个度数为1的树,再次合并
在这里插入图片描述
合并后得到一个度为2的树,再次合并
在这里插入图片描述
得到一个度为3的树
在这里插入图片描述
指针继续右移,记录度1
在这里插入图片描述
继续右移,记录度0
在这里插入图片描述
继续右移,找到一个度为2的树
在这里插入图片描述
合并相同度为1的树
在这里插入图片描述
继续右移在这里插入图片描述
没有相同度数时执行完毕,最终得到一个斐波那契堆如下:
在这里插入图片描述

分析

在这里插入图片描述

  • 实际开销: O ( D ( n ) + t ( H ) ) O(D(n)+t(H)) O(D(n)+t(H))
    1. O ( D ( n ) ) : O(D(n)): O(D(n)):将最小结点的孩子结点加入根链中并更新最小结点
    2. O ( D ( n ) + t ( H ) ) : O(D(n)+t(H)): O(D(n)+t(H)):合并相同度的树
  • 摊还时间复杂度: O ( D ( n ) ) O(D(n)) O(D(n))
    1. t ( H ′ ) ≤ D ( n ) + 1 t(H ') \le D(n) + 1 t(H)D(n)+1因为所有树度数均不同
    2. ∆ Φ ( H ) ≤ D ( n ) + 1 − t ( H ) ∆\Phi(H ) \le D(n) + 1- t(H) ∆Φ(H)D(n)+1t(H)

在这里插入图片描述

Decrease Key

第一种情况

在这里插入图片描述

  • 最小堆性质未被破坏
  • 有必要的话可以改变最小指针

示例
在这里插入图片描述

剩余情况用书上的例子解释
附上伪代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

删除

在这里插入图片描述

最大度数的界

在这里插入图片描述
在这里插入图片描述


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

相关文章

数据结构——斐波那契堆

斐波那契堆的介绍 斐波那契堆(Fibonacci heap)是一种可合并堆,可用于实现合并优先队列。它比二项堆具有更好的平摊分析性能,它的合并操作的时间复杂度是O(1)。与二项堆一样,它也是由一组堆最小有序树组成,并且是一种可合并堆。与二…

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

前言 第六章堆排序使用了普通的二叉堆性质。其基本操作性能相当好,但union性能相当差。 对于一些图算法问题,EXTRACT-MIN 和DELETE操作次数远远小于DECREASE-KEY。因此有了斐波那契堆。 斐波那契堆结构 斐波那契堆是一系列具有最小堆序的有根树的集合…

斐波那契堆(Fibonacci heaps)

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

3.3 斐波那契堆

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

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

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

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

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

斐波那契堆 - 解析与实现

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

算法导论 斐波那契堆

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

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

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

斐波那契堆

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

斐波那契堆(Fibonacci Heap)

也许我们每个人都知道斐波那契数列(Fibonacci sequence)。即这样一个数列: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语言的实现

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

斐波那契堆的C++实现

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

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

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

电工电子复习题

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

我的元器件入门

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

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

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

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

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

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

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

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

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