斐波那契堆(Fibonacci heap)原理详解
前言
斐波那契堆(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)原理详解相关推荐
- 斐波那契堆(Fibonacci heaps)
一:斐波那契堆 1:特性 斐波那契堆同二项堆一样,也是一种可合并堆.斐波那契堆的优势是:不涉及删除元素的操作仅需要O(1)的平摊运行时间(关于平摊分析的知识建议看<算法导论>第17章).和 ...
- LeetCode 873. 最长的斐波那契子序列的长度 题目详解
题目详情 如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的: n >= 3 对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_ ...
- 斐波那契查找(黄金分割法)超详细详解
斐波那契查找思路 说句实在话,这个斐波那契查找我看了不下5遍才理解他的思路和代码,因为它里面的值太多,不好理解容易绕晕,所以我给大家用自己的理解讲一下 什么是斐波那契 要想学会斐波那契查找,首先你得知 ...
- python 斐波那契数列 yield_Python之yield详解
今天小编给大家带来的是Python教程之yield,好多新人跟小编反应这个东西不懂,而且网上也没找到足够简单的教程,小编回复了大家之后觉得很有必要将yield讲一下. 在讲yield之前必须明确两个概 ...
- 优先队列——斐波那契堆(without source code)
[0]README 0.1) 本文部分内容转自 数据结构与算法分析,旨在理解 斐波那契堆 的基础知识: 0.2) 文本旨在理清 斐波那契堆的 核心idea,还没有写出源代码实现,表遗憾: 0.3)从实 ...
- Java数据结构与算法---斐波那契数列Fibonacci
Java数据结构与算法-斐波那契数列Fibonacci 原理都很简单,直接上代码: package cn.m_fibonacci;public class Fibonacci {public stat ...
- 《算法导论》第19章-斐波那契堆 引入 19.1 斐波那契堆结构
引入 1.可合并堆 可合并堆(mergeable heap)是支持以下5种操作: MAKE-HEAP():创建和返回一个新的不含任何元素的堆. INSERT(H,x):将一个已填人关键字的元素x插人堆 ...
- 《算法导论3rd第十九章》斐波那契堆
前言 第六章堆排序使用了普通的二叉堆性质.其基本操作性能相当好,但union性能相当差. 对于一些图算法问题,EXTRACT-MIN 和DELETE操作次数远远小于DECREASE-KEY.因此有了斐 ...
- 斐波那契堆为何称为斐波那契
本文只讨论斐波那契堆与斐波那契数列的关系,不对其增删改查做说明.(只是讨论) 废话一句: 斐波那契数列的递推公式:an=an-1+an-2 废话两句: 剪枝操作: 一个节点不能丢掉两个子节点,不然他也 ...
- 算法导论读书笔记-第十九章-斐波那契堆
算法导论第19章--斐波那契堆 可合并(最小)堆(mergeable min-heap) : 支持以下5种操作的一种数据结构, 其中每一个元素都有一个关键字: MAKE-HEAP(): 创建和返回一个 ...
最新文章
- python image stiching_Python自然语言处理,词云图生成
- hdu3790 最短路径问题(spfa)
- vue文件快速生成模板代码
- GNS3关联SecureCRT的配置。
- 计算机硬件维修是哪个专业,计算机硬件维护须知
- C++日志系统log4cxx使用总结
- vue wabpack 切换开发环境 和生成环境 的接口地址
- xfce不小心禁用了鼠标
- 数据库中的二级索引_普通索引_辅助索引
- threejs加载3D模型例子
- android 显示清除缓存
- 2013应届毕业生“百度”校招应聘总结
- 错误:invalid_client没有应用程序名称
- POJ3980 取模运算【水题】
- 数据库索引是什么 有什么优缺点
- 轻松盘,资产盘点不再难 RFID办公资产盘点管理
- PrimitiveCollection
- 每天记忆五个词根之四
- python编程计算圆面积和周长_vb编程计算圆周长面积
- Word2vec词向量工具带你发现不一样的《天龙八部》