斐波那契堆

✍ dations ◷ 2025-05-19 00:31:51 #数据结构,堆

斐波那契堆(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),则去除该标记。

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

相关

  • EB病毒人类疱疹病毒第四型(拉丁语:Epstein-Barr virus,缩写EBV、爱泼斯坦-巴尔病毒、 human herpesvirus 4 (HHV-4)),又称为EB病毒,是最常见能引起人类疾病的病毒之一。EBV是在公元1964
  • 可变剪接选择性剪接(英语:Alternative splicing;又称“可变剪接”)是基因表达的方式,在复杂的动物例如人类细胞是非常普遍的。真核细胞的基因序列中,包含了内含子(intron)与外显子(exon),两者交
  • 进香进香,原指善男信女到名山寺庙进行朝拜的活动,在中国民间信仰则亦指庙宇间的交流活动,信徒迎请神明前往外地庙宇拜会、联谊,借此巩固双方情谊。当队伍经过其他友好庙宇时,神明主轿
  • 圣文森特和格林纳丁斯中华民国-圣文森特和格林纳丁斯关系是指中华民国与圣文森特和格林纳丁斯之间的外交关系。2016年8月,原本与中华民国友好的圣文森反对党新民主党由其党魁尤斯特(Arnhim Eustace)
  • 共路信令共路信令(Common-channel signaling,CCS),是相对随路信令而言的。 在共路信令中,电路的一个专用时隙传送各音频通路上的信令信息,这个时隙经常成为数据信道。现在一般多为“七号信
  • 斯蒂恩·迈尔斯奥利斯蒂恩·“斯蒂恩”·迈尔斯(英语:Ollisteen 'Steen' Miles;1946年8月20日-2017年3月29日),是美国的民主党政治人物,前佐治亚州参议院议员。迈尔斯出生在印地安纳州南本德,曾入
  • 郑杲郑杲(1851年-1900年),字东父、东甫,直隶永平府迁安县(今河北省迁安县)人,清朝政治人物,同进士出身。郑杲父鸣冈,任山东即墨县知县,卒于官,家贫不能归里,于是寄籍当地。郑杲事母至孝。光绪
  • 布拉斯·罗加弗朗西斯科·布拉斯·罗加·卡尔德里奥(西班牙语:Francisco Blas Roca Calderío,1908年7月24日-1987年4月26日)是古巴政治家和马列主义理论家,人民社会党中央委员会总书记、全国
  • 姹女姹女,是道教外丹派的术语,意思是指朱砂,化学术语为“硫化汞”。一般都与“婴儿”合用。“婴儿”指的其实是“铅”。当时的道教利用这些特殊的术语,把化学变化写成一些玄之又玄的
  • 理查德·普赖尔理查德·富兰克林·雷诺士·汤玛斯·普赖尔(英语:Richard Franklin Lennox Thomas Pryor,1940年12月1日-2005年12月10日)是一名美国男演员、脱口秀喜剧演员、编剧、制片人和导演