3.3 斐波那契堆

article/2025/8/29 14:28:46

结构

  斐波那契堆的基础是可合并堆。
数据结构是一个森林。也就是N棵树。这点和二项堆一样。
这个结构没有二项堆那么多的要求。
在这里插入图片描述

  Rank的概念,是子节点的数目

在这里插入图片描述
  与二项堆不同的是,斐波那契堆的底层链表要成环,要双向链表。
  而斐波那契堆的节点,是这样的。每个节点有parent,只有一个child。但是每个child都是个双向链表节点。
  所以斐波那契节点实际上是多了两个属性的双向链表节点。所以继承自LinkedListNode。
  斐波那契堆节点主要有以下属性:

# _*_ coding:utf-8 _*_
from com.youngthing.heaps.linked_list_node import LinkedListNodeclass FibonacciNode(LinkedListNode):def __init__(self, key):self.__p = Noneself.__child = Noneself.__rank = 0self.__mark = Falsesuper().__init__(key)@propertydef p(self):return self.__p@p.setterdef p(self, p):self.__p = p@propertydef child(self):return self.__child@child.setterdef child(self, child):self.__child = childif child is not None:child.p = self@propertydef rank(self):return self.__rank@rank.setterdef rank(self, rank):self.__rank = rank@propertydef mark(self):return self.__mark@mark.setterdef mark(self, mark):self.__mark = markdef children(self):x = self.childif x is None:return []result = [x]while x.next is not None and x.next is not self.child:result.append(x.next)x = x.siblingreturn resultdef insert(self, other):"""对于环的插入操作,需要:param other::return:"""def union(self, other):# 连接rootself.next = otherother.next = self.next# 指向新的def __str__(self):return str(self.key)

##插入
  斐波那契堆的插入只不过是在链表上插入一个节点而已。但是这样会有疑惑,这样组成链表,不是查询效率很低吗?
  但是可以斐波那契堆才有了一种lazy的策略,在取最小值的时候才调整,减少链表节点数量。
python代码如下:

def insert(self, key):node: FibonacciNode = FibonacciNode(key)# 连上下一个# 如果是空if self.__min is None:self.__min = node# 只有一个元素的环,要连自己node.next = nodereturn# 环尾end = self.__min.prev# 断开,接上新的end.next = nodenode.next = self.__min# 指向新的if node.key < self.__min.key:self.__min = node

union

  如果是直接合并另一个,代码非常简单

def union(self, other):# 连接rootself.__min.next = other.__minother.__min.next = self.__min.next# 指向新的if other.__min.key < self.__min.key:self.__min = other.__min

##弹出最小
  这个版本比较多。
上海交大的资料里是先consolidate,再删除最小节点。
美国波士顿东北大学的资料是先删除最小节点再consolidate。
但这都不重要,重要的是consolidation过程。
consolidation是斐波那契堆的私有方法,是在删除最小项之前用的。因为斐波那契堆采用了一种懒调整的策略。所以尽量不合并。注意这个合并不是union。核心思想就是把相同rank的节点合并到一起。合并的策略是看谁的key小,key大的就做key小的节点的child,并且和key小者的原有child连起来形成一个环。

def extra_min(self):if self.__min is None:return None# 只有一个元素的时候if self.__min.next is self.__min and self.__min.rank == 0:r = self.__minself.__min = Noneprint('只有一个元素')return rr = self.__min# 继续改代码,先加入进来# 先删除最小,但是要把min的child加进去啊r_child = r.childif r_child is not None:temp = r.nextrchild_end = r_child.prevr.next = r_childrchild_end.next = temp# 移除rr.prev.next = r.nextmin_node = self.find_min_node(r.prev)self.__min = min_nodeself.consolidate()if self.__min.next is None:raise RuntimeError('未成环')r.next = Noner.prev = Nonereturn r

  而调用的方法

# 斐波那契堆的合并
def consolidate(self):# 遍历环寻找等级相等的pair = self.find_pair()while pair is not None:pair[0].link(pair[1])# 为什么会重复两次?pair = self.find_pair()def find_pair(self):start = self.__minwhile start.next is not self.__min:end = start.nextwhile end.next is not start:if start.rank == end.rank:return start, endend = end.nextstart = start.nextreturn None

  核心而且容易出错的方法在FibonacciNode类中,这是两个节点合并为一个节点的方法。

def link(self, other):""":param other: 另一个节点:return: None"""if other.key < self.key:other.link(self)returnprint('link', self, other)# list上移除otherother.prev.next = other.next# 先一个个来# min的变化, list上移除max, child 变成max# max要作为childtemp = self.childself.child = otherself.rank = self.rank + 1# max 的变化,连上min以前的child,但是因为是环,所以需要插进去if temp is not None:temp.prev.next = otherother.next = tempelse:other.next = other#如此,执行完了

这样一个斐波那契堆就写完了。


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

相关文章

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

二叉堆 二叉树 二叉树&#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…

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

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

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

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