Fibonacci Heaps——python实现

  • 前言
  • functions
    • decreaseKey(v, k)
    • delete(v)
  • 结语

前言

Fibonacci Heaps的所有内容都在这里 Fibonacci Heaps 可以找到。

简单的概括,斐波那契堆其实是 lazy binomial heaps 的扩展,支持更高效的 decreaseKey(v,k)delete(v). 那么在 lazy binomial heaps实现 的基础上稍作改动和扩展即可。

完整代码和测试代码已上传资源…

functions

大部分操作的实现与 lazy binomial heaps 无异。只是一些细节有所不同:在这里 insert(x)⟹\implies⟹insert(v), 插入的是节点,在扩展的 Binomial Tree节点中需要存是否已丢失孩子的 mark,维护 merge 时保证连进来的 root unmarked, 以及 在coalesce step 中创建箱子的个数,log 的 base…

所以大量的重复内容,merge, insert, extractMin, find_min, coalesce step. updateMin,就不在这里展示了,同样参考前面的实现博客吧。

另外表示方法也同之前一样,双向循环链表,父结点只存一个孩子。

decreaseKey(v, k)

这里唯一的问题就是 cascading cut,级联切割,当我们要 decreaseKey 的 node 的父节点已经损失了孩子。此时为了保证 root 的 order 和其节点数 n 的关系 ϕroot.order≤n\phi^{root.order} \leq nϕroot.order≤n,即斐波那契数列的性质,所以也要把 node 的 parent 同样切下来,直到遇到没有损失孩子的 parent 或者根。

    def decreaseKey(self,v,k):if k < self.min.data:  # update min ptrself.min = vv.data = kif not v.parent: # root, no need to cutreturnnew_heap = Fibonacci_Heap()if v.pre == v: # only one childassert v.parent.order == 1,'wrong order'new_heap.head = vnew_heap.min = vself.merge(new_heap)v = v.parentv.Lchild.parent = Nonev.Lchild = Noneelse:if v.parent.Lchild == v:v.parent.Lchild = v.siblingtemp = v.parentv.pre.sibling = v.siblingv.sibling.pre = v.prev.pre = vv.sibling = vnew_heap.head = vnew_heap.min = vself.merge(new_heap)v.parent = Nonev = tempv.order -= 1while v.parent:if v.losing_child:v.losing_child = Falseif v.pre == v:  # only one child, same as beforeassert v.parent.order == 1, 'wrong order'new_heap.head = vnew_heap.min = vself.merge(new_heap)v = v.parentv.Lchild.parent = Nonev.Lchild = Noneelse:if v.parent.Lchild == v:v.parent.Lchild = v.siblingtemp = v.parentv.pre.sibling = v.siblingv.sibling.pre = v.prev.pre = vv.sibling = vnew_heap.head = vnew_heap.min = vself.merge(new_heap)v.parent = Nonev = tempv.order -= 1else:v.losing_child = Truebreak

delete(v)

delete(v) 的实现非常简单…

    def delete(self,v):self.decreaseKey(v,float('-inf'))self.extractMin()

结语

有点儿水…

但堆相关这部分内容,从知识搬运消化,到上码实战,总算完啦,液✌。

斐波那契堆python实现——Fibonacci Heaps相关推荐

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

    前言 第六章堆排序使用了普通的二叉堆性质.其基本操作性能相当好,但union性能相当差. 对于一些图算法问题,EXTRACT-MIN 和DELETE操作次数远远小于DECREASE-KEY.因此有了斐 ...

  2. 斐波那契堆(Fibonacci heaps)

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

  3. 优先队列——斐波那契堆(without source code)

    [0]README 0.1) 本文部分内容转自 数据结构与算法分析,旨在理解 斐波那契堆 的基础知识: 0.2) 文本旨在理清 斐波那契堆的 核心idea,还没有写出源代码实现,表遗憾: 0.3)从实 ...

  4. 斐波那契数列 python 高阶解法

    斐波那契数列 python 高阶解法 2022.09.27 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以 ...

  5. 斐波那契堆为何称为斐波那契

    本文只讨论斐波那契堆与斐波那契数列的关系,不对其增删改查做说明.(只是讨论) 废话一句: 斐波那契数列的递推公式:an=an-1+an-2 废话两句: 剪枝操作: 一个节点不能丢掉两个子节点,不然他也 ...

  6. 算法导论读书笔记-第十九章-斐波那契堆

    算法导论第19章--斐波那契堆 可合并(最小)堆(mergeable min-heap) : 支持以下5种操作的一种数据结构, 其中每一个元素都有一个关键字: MAKE-HEAP(): 创建和返回一个 ...

  7. 算法导论之斐波那契堆

    斐波那契堆,和二项堆类似,也是由一组最小堆有序的树构成.注意区别,不是二项树,是有根而无序的树.导论中,斐波那契堆只是具有理论上的意义,是以平摊分析为指导思想来设计的数据结构,主要是渐进时间界比二项堆 ...

  8. boost::graph模块实现斐波那契堆的测试程序

    boost::graph模块实现斐波那契堆的测试程序 实现功能 C++实现代码 实现功能 boost::graph模块实现斐波那契堆的测试程序 C++实现代码 #include <boost/c ...

  9. 算法导论--斐波那契堆

    斐波那契堆 斐波那契堆也是数据储存结构的一种,这种数据结构之所以产生,主要有两个优点:1.对于数据合并操作具有很高的效率:2.对于其他一般数据操作平均时间复杂度较好(注意这里是平均复杂度,不是最坏情形 ...

  10. 斐波那契堆(不太详尽)

    总结:这一章讲了斐波那契堆,它是一种比二项堆更松散的堆,它由一组无序的二项树组成,对不涉及删除元素的操作,它仅需O(1)的平摊运行时间.本章介绍斐波那契堆的插入.合并.删除等操作. 1.    斐波那 ...

最新文章

  1. js如何同时打开多个信息窗口 高德地图_高德地图-展示多个信息窗口
  2. QLibrary 动态加载外部库文件
  3. 计算机视觉和模式识别领域SCI期刊介绍
  4. google 用新的tab打开网页
  5. libsvm中tools(easy.py,subset.py,grid.py,checkdata.py)的使用
  6. ajax获取php的数组,使用AJAX请求获取数组并将其传递到php数组中 - javascript
  7. 解决maven打包报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2
  8. C#企业级开发案例精解:用经典案例学通 NET技术
  9. android整理的一些零散笔记
  10. paip.解决问题Unable to access jarfile E:\resin-4.0.22\lib\resin.jar
  11. 淘宝开放接口api分享
  12. 如何解决wmv/asf/asx格式转成mp4/avi/3gp/mpg/flv的问题
  13. IE主页被篡改的修复方法
  14. unbuntu 安装node
  15. php 7.1安装sockets,Centos7 下 PHP 添加缺少的组件 sockets 和 openssl
  16. 都快2021年了,居然还有人不会MECE
  17. 分式怎么开根号_怎么打出根号二(教你如何写出√2的连分式)
  18. 凸优化:ADMM(Alternating Direction Method of Multipliers)交替方向乘子算法
  19. linux 巨型帧 网卡,Linux Kernel e1000驱动巨型帧处理绕过安全检查漏洞
  20. DOS命令之For命令用法

热门文章

  1. e320/t420/w520等 qm67/hm65/hm67等 6系芯片组更新BIOS以安装三代酷睿cpu提升性能的想法
  2. UE4 虚幻引擎 Metahuman怎么导入到项目中
  3. qdir 自动创建多级目录_QDir 类 - 目录信息类
  4. 惠威D1080带来精致听音感受
  5. 数学建模之数据包络分析(评价投入产出比的模型)
  6. 深度学习与自然语言处理 | 斯坦福CS224n · 课程带学与全套笔记解读(NLP通关指南·完结)
  7. OpenPose学习笔记
  8. mac安装maven
  9. ubuntu 文件名乱码
  10. SONY α系列(A6000A7)数码微单相机APP破解免付费安装教程