斐波那契堆

✍ dations ◷ 2025-08-18 19:50:26 #数据结构,堆

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

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

相关

  • 慢性肾脏疾病慢性肾脏病(又称慢性肾功能不全或慢性肾衰竭、Chronic kidney disease(CKD)、chronic renal disease(CRD)),指肾功能在几个月或若干年期间逐渐而难以逆转的衰退。据估计,慢性肾病患
  • 不育不孕(英语:Infertility)又称不育,是指人类、动物或植物无法透过有性生殖繁衍后代的情形。对于大部分健康的成熟动植物个体而言,会在生命中的特定时期内有生育能力,不过真社会性物
  • 傈僳竹书陶文 ‧ 甲骨文 ‧ 金文 ‧ 古文 ‧ 石鼓文籀文 ‧ 鸟虫书 ‧ 篆书(大篆 ‧  小篆)隶书 ‧ 楷书 ‧ 行书 ‧ 草书漆书 ‧  书法 ‧ 飞白书笔画 ‧ 
  • 硫化铁硫化铁(化学式:Fe2S3),是三种铁的硫化物(英语:iron sulfide)之一,此外还有FeS和FeS2。它是一种固体棕色粉末,但在常温下腐化为黄绿色粉末。这是一种十分不稳定的人造产物,不存在于自然
  • 伊丽莎白·布雷克本伊丽莎白·海伦·布莱克本,FRS(英语:Elizabeth Helen Blackburn,1948年11月26日-),分子生物学家,生于澳大利亚、现居美国,拥有澳、美两国国籍,现任加利福尼亚大学旧金山分校生物化学与
  • 台湾基隆地方法院坐标:25°07′44″N 121°45′51″E / 25.128782°N 121.764267°E / 25.128782; 121.764267台湾基隆地方法院,是中华民国的三级法院之一,位于台湾基隆市,属于普通法院,一般被简
  • 金喜善金喜善(韩语:김희선,英语:Kim Hee-Seon ,1977年6月11日-),韩国女演员。金喜善就读11级时,参加韩国青春美少女大赛,并开始在电视上演出。她的第一套演出的电视剧是1993年播出的《恐龙先
  • Jerry Maguire《甜心先生》(英语:Jerry Maguire)是一部在1996年上映的美国浪漫喜剧电影,由卡麦隆·克罗执导,汤姆·克鲁斯、芮妮·齐薇格和小古巴·古丁等人主演。这部电影制作费仅为5千万美元
  • 路德维希四世 (黑森大公)路德维希四世,KG(Ludwig IV.,1837年9月12日-1892年3月13日),全名腓特烈·威廉·路德维希·卡尔(Friedrich Wilhelm LUDWIG Karl),黑森的第四任大公,1877年至1892年在位。路德维希四世
  • 初野晴初野晴(1973年-),日本男性小说家、推理作家。出身于静冈县清水市(今静冈市清水区)。国中时期曾将横沟正史的作品全部读完。升上高中之后加入柔道社,擅长的招式是内股(日语:内股)。喜欢