前言

  斐波那契堆(Fibonacci heap)是计算机科学中最小堆有序树的集合。它和二项式堆有类似的性质,但比二项式堆有更好的均摊时间。堆的名字来源于斐波那契数,它常用于分析运行时间。

堆结构介绍

  基本术语介绍:

  关键字:堆节点储存的用于比较的信息

  度数:堆节点拥有的孩子数(注意,不包括孩子的孩子)

  左兄弟:节点左边的兄弟节点

  右兄弟:节点右边的兄弟节点

  mark:是否有孩子节点被删除

  斐波那契堆是一系列无序树的集合,每棵树是一个最小堆,满足最小堆的性质。(注意,树是无序的,所以不要纠结树该怎么排序)。堆保存了堆中所有节点的数目,保存了最小关键字的节点(这是整个堆的唯一入口,根据这个最小节点可以获取整个堆的任何节点)。

  堆的节点是堆的最小单位,它是双向链表的节点,意味着它保存了上下节点的信息,如下图,(也能看出树的根节点排列是无序的)。

  

  它主要有如下性质:

  1、关键字

  2、度数

  3、左兄弟

  4、右兄弟

  5、父节点

  6、孩子节点(任一个孩子节点,随意)

堆基本操作

  一、插入操作

    1、创建一个节点,如21

  

  2、把新建的节点插入到根链表中,如果是最小值,则更新它为堆的最小节点。插入位置没有规定,一般习惯插入到min的左边。把堆的“所有节点数”值加1

  

  3、插入操作完成了(插入并不会对堆进行修改,修改是在其他操作中进行的,所以比较简单)

  二、删除最小节点

    1、删除最小节点,并把它的所有孩子合并到堆的根链表中,并更新min

  2、合并根节点的树,使任何树的度(rank)不相等

    观察到7有1个孩子节点,即度为1,先保存起来,由于是初始的,肯定没有和7度相同的

    接着下一个根节点24,度为2,继续。

    23, 度为1,继续

    17, 度为1。 由于已经有度为1的根节点了,所以需要合并这两个节点

    根据最小堆得性质,把23合并到17上,作为17的孩子节点

    此时17的度为2,仍然重复,继续合并,直到没有度一样的根节点

    最终结果如下图

    

  三、减小key值

    如果没有违背最小堆的性质,直接减小key的值

    否则,把以key为根节点的树合并到堆的根链表中

    如果有一个节点有两个孩子移除了,把这个节点也合并到根链表中,并且unmark它

    

    现在举一个例子来说明各种可能情况

    1、不违反最小堆性质

      把46减小为29,不违反最小堆性质,不改变堆结构

  

    2、违反最小堆性质,合并到根链表中,并且unmark 它

      把29减小为15,违反了堆性质

  

    把15合并到根链表中

  如果父节点没有mark(没有失去孩子), 设置它为mark

  

  如果父节点已经是mark,则把父节点合并到根链表中,并设置为unmark。

  把节点35减小到5 

  

  由于违反了,把5合并到根

  由于26已经mark,把26这个子树合并到根

  同理24合并到根

  由于7已经是根节点了,停止,全部结束

  四、删除节点

    删除节点比较简单,主要分为两步

    1、把节点值decrease比堆最小值还小

    2、删除最小值

原文链接http://www.cnblogs.com/junyuhuang/p/4463758.html

斐波那契堆(Fibonacci heap)原理详解相关推荐

  1. 斐波那契堆(Fibonacci heaps)

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

  2. LeetCode 873. 最长的斐波那契子序列的长度 题目详解

    题目详情 如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的: n >= 3 对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_ ...

  3. 斐波那契查找(黄金分割法)超详细详解

    斐波那契查找思路 说句实在话,这个斐波那契查找我看了不下5遍才理解他的思路和代码,因为它里面的值太多,不好理解容易绕晕,所以我给大家用自己的理解讲一下 什么是斐波那契 要想学会斐波那契查找,首先你得知 ...

  4. python 斐波那契数列 yield_Python之yield详解

    今天小编给大家带来的是Python教程之yield,好多新人跟小编反应这个东西不懂,而且网上也没找到足够简单的教程,小编回复了大家之后觉得很有必要将yield讲一下. 在讲yield之前必须明确两个概 ...

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

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

  6. Java数据结构与算法---斐波那契数列Fibonacci

    Java数据结构与算法-斐波那契数列Fibonacci 原理都很简单,直接上代码: package cn.m_fibonacci;public class Fibonacci {public stat ...

  7. 《算法导论》第19章-斐波那契堆 引入 19.1 斐波那契堆结构

    引入 1.可合并堆 可合并堆(mergeable heap)是支持以下5种操作: MAKE-HEAP():创建和返回一个新的不含任何元素的堆. INSERT(H,x):将一个已填人关键字的元素x插人堆 ...

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

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

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

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

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

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

最新文章

  1. python image stiching_Python自然语言处理,词云图生成
  2. hdu3790 最短路径问题(spfa)
  3. vue文件快速生成模板代码
  4. GNS3关联SecureCRT的配置。
  5. 计算机硬件维修是哪个专业,计算机硬件维护须知
  6. C++日志系统log4cxx使用总结
  7. vue wabpack 切换开发环境 和生成环境 的接口地址
  8. xfce不小心禁用了鼠标
  9. 数据库中的二级索引_普通索引_辅助索引
  10. threejs加载3D模型例子
  11. android 显示清除缓存
  12. 2013应届毕业生“百度”校招应聘总结
  13. 错误:invalid_client没有应用程序名称
  14. POJ3980 取模运算【水题】
  15. 数据库索引是什么 有什么优缺点
  16. 轻松盘,资产盘点不再难 RFID办公资产盘点管理
  17. PrimitiveCollection
  18. 每天记忆五个词根之四
  19. python编程计算圆面积和周长_vb编程计算圆周长面积
  20. Word2vec词向量工具带你发现不一样的《天龙八部》

热门文章

  1. linux opendir,linux opendir和readdir的使用
  2. R语言基于mgcv包进行广义可加模型及交互作用演示(2)
  3. 阿里矢量图标及其引入方式
  4. Mac、M1怎么安装Maven
  5. 软考中级软件设计师--5面向对象基础
  6. NTC热敏电阻温度计算方法,Steinhart-Hart方程和B值法
  7. Mysql查询去空格方法汇总
  8. linux重启tomcat进程,Linux系统重启tomcat服务的方法详解
  9. matlab中的ifftshift的用法,如何在R中写fftshift和ifftshift?
  10. Python读写txt文件