斐波那契堆

✍ dations ◷ 2024-12-23 08:19:12 #数据结构,堆

斐波那契堆(Fibonacci heap)是计算机科学中树的集合。它比二项堆具有更好的平摊分析性能,可用于实现合并优先队列。不涉及删除元素的操作有O(1)的平摊时间。 Extract-Min和Delete的数目和其它相比,较小时效率更佳。稠密图每次decrease key只要O(1)的平摊时间,和二项堆的O(lg n)相比是巨大的改进。

斐波纳契堆于1984年由Michael L. Fredman与Robert E. Tarjan提出,1987年公开发表。名字来源于运行时分析使用的斐波那契数。

斐波那契堆是由一组最小堆有序树构成的。每个节点的度数为其子节点的数目。树的度数为其根节点的度数。

斐波那契堆中的树都是有根的但是无序。每个节点包含指向父节点的指针和指向任意一个子结点的。x的所有子节点都用双向循环链表链接起来,叫做的子链表。子链表中的每一个节点都有指向它的左兄弟的和右兄弟的。如果节点是仅有的子节点,则。

斐波那契堆中所有树的根节点也用一个双向循环链表链接起来。

使用一个指针指向斐波那契堆中最小元素。

此处示例中使用的编程语言为C

每个结点x的域

//斐波那契结点ADTstruct FibonacciHeapNode {    int key;       //结点    int degree;    //度    FibonacciHeapNode * left;  //左兄弟    FibonacciHeapNode * right; //右兄弟    FibonacciHeapNode * parent; //父结点    FibonacciHeapNode * child;  //第一个孩子结点    bool marked;           //是否被删除第1个孩子};typedef FibonacciHeapNode FibNode;

对于一个给定的斐波那契堆H,可以通过指向包含最小关键字的树根的指针min来访问,这个结点被称为斐波那契堆中的最小结点。如果一个斐波那契堆H是空的,则min = NIL. 在一个斐波那契堆中,所有树的根都通过left和right指针链接成一个环形的双向链表,称为堆的根表。于是,指针min就指向根表中具有最小关键字的结点。

//斐波那契堆ADTstruct FibonacciHeap {    int keyNum;   //堆中结点个数    FibonacciHeapNode * min;//最小堆,根结点    int maxNumOfDegree;   //最大度    FibonacciHeapNode * * cons;//指向最大度的内存区域};typedef FibonacciHeap FibHeap;

创建一个空的斐波那契堆,过程MAKE-FIB-HEAP 分配并返回一个斐波那契堆对象H;

//初始化一个空的Fibonacci HeapFibHeap * FibHeapMake() {    FibHeap * heap = NULL;    heap = (FibHeap *) malloc(sizeof(FibHeap));    if (NULL == heap) {        puts("Out of Space!!");        exit(1);    }    memset(heap, 0, sizeof(FibHeap));    return heap;} //初始化结点xFibNode * FibHeapNodeMake() {    FibNode * x = NULL;    x = (FibNode *) malloc(sizeof(FibNode));    if (NULL == x) {        puts("Out of Space!!");        exit(1);    }    memset(x, 0, sizeof(FibNode));    x->left = x->right = x;    return x;}

插入一个节点

创建一个仅包含一个节点的新的斐波纳契堆,然后执行堆合并。

由于用一个指针指向了具有最小值的根节点,因此查找最小的节点是简单的操作。

简单合并两个斐波纳契堆的根表。即把两个斐波纳契堆的所有树的根首尾衔接并置。

分为三步:

对一个节点的键值降低后,自键值降低的节点开始自下而上的迭代执行下述操作,直至到根节点或一个未被标记(marked)节点为止:

如果当前节点键值小于其父节点的键值,则把该节点及其子树摘下来作为堆的新树的根节点;其原父节点如果是被标记(marked)节点,则也被摘下来作为堆的新树的根节点;如果其原父节点不是被标记(marked)节点且不是根节点,则其原父节点被加标记。

如果堆的新树的根节点被标记(marked),则去除该标记。

把被删除节点的键值调整为负无穷小,然后执行“降低一个节点的键值”算法,然后再执行“删除最小节点”算法。

相关

  • 米格尔·卡布瑞拉米格尔·卡布瑞拉(José Miguel Torres Cabrera,1983年4月18日-)为委内瑞拉的棒球选手之一,目前效力于美国职棒大联盟底特律老虎队。他在2003年登上大联盟时,身高六呎二吋,体重210
  • 熊本县熊本县(日语:熊本県/くまもとけん Kumamoto ken */?)是位于日本九州的一个县,位于九州中央,在令制国时代称肥后国,与九州其他六县都有接壤或隔内海湾柤望,面积7400平方公里,人口170
  • 道德恐慌道德恐慌是根据对特定个体或团体的误解发起大众运动,对于不了解或不合社会主流价值的个人或团体给予打压,通常经过媒体炒作。另外道德恐慌也可能半自发的发生。群众歇斯底里(ma
  • 环面在几何上,一个环面是一个甜甜圈形状的旋转曲面,由一个圆绕一个和该圆共面的一个轴回转所生成。球面可以视为环面的特殊情况,也就是旋转轴是该圆的直径时。若转轴和圆不相交,圆面
  • 人类学博物馆坐标:25°01′04″N 121°32′06″E / 25.017815°N 121.534912°E / 25.017815; 121.534912国立台湾大学人类学博物馆收藏承接自台北帝国大学时代“土俗人种学讲座”标本室
  • 格瓦拉主义格瓦拉主义(西班牙语:Guevarismo;英语:Guevarism),又称游击中心主义或游击中心论。1960年代,格瓦拉主义产生于拉丁美洲,然后传播到世界各地。它是古巴革命领导人之一切·格瓦拉,在总
  • S-3BS-3北欧海盗式反潜机(英语:Lockheed S-3 Viking),是美国洛克希德公司(现洛克希德·马丁公司)生产的一种双喷气发动机式的喷气式飞机,是S-2搜索者巡逻机的后继,美国海军于1968年提出S
  • 比恩维尔国家森林比恩维尔国家森林(英语:Bienville National Forest)是美国的一处国家森林,1936年6月15日建立,位处密西西比州,占地面积约178,541英亩(722.53平方千米),最近的城市为杰克逊市。该森林
  • 宋林皋宋林皋,为明朝著名女科(妇科)医学家,约活动于万历年间(1573年~1620年),明州(今浙江宁波)人。宋林皋写成了中国古代女科集大成的《宋氏女科秘书》。以宋林皋的宋氏医学世家历二十余世,以
  • PlayStation VRPlayStation VR(简称“PSVR”)是索尼互动娱乐研发的虚拟实境头戴式显示器,自2016年10月13日开始贩售。本机是索尼专门为PlayStation 4电视游戏主机制作的设备,因此需要PS4进行图