博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法导论 第十九章:斐波拉契堆
阅读量:7035 次
发布时间:2019-06-28

本文共 1388 字,大约阅读时间需要 4 分钟。

   斐波拉契堆是由一组最小堆有序树组成,每棵树遵循最小堆性质。而且每棵树都是有根而无序的。

全部树的根通过left和right指针来形成一个环形的双链表。称为该堆的根表。

   对于一个给定的斐波拉契堆H 。能够通过指向包括最小keyword的树根指针H.min来訪问。堆中每一个节点还包括x.mark,x.degree两个域,x.degree表示x的子女表中的子女个数。x.mark表示从x上次成为还有一个节点子女以来是否失掉一个孩子。

斐波拉契对的结构例如以下:

势能函数:

能够利用势能方法来分析斐波拉契堆的性能。其势能函数定义为:

          

当中m(H)指H中有标记节点的个数,t(H)表示H的根表中树的棵数。

最大度数:

如果在包括n个节点的斐波拉契堆中,节点的最大度数又一个已知的上界D(n),则有:

                   

提取斐波拉契堆最小值代码例如以下:

#include
#include
using namespace std;typedef struct FibHeapNode{ int key; int degree; FibHeapNode *left; FibHeapNode *right; FibHeapNode *parent; FibHeapNode *child; bool mark; FibHeapNode(int k):key(k),degree(0),left(NULL),right(NULL),parent(NULL),child(NULL),mark(false){} }FibHeapNode;typedef struct FibHeap{ int Num; //the number of node in the heap FibHeapNode *min; //the minimum heap,root node //int maxDegree; //maximum degree }FibHeap;void AddNodeToRootList(FibHeapNode *Hmin,FibHeapNode *x){ x->right = Hmin->right; x->left = Hmin ; if(Hmin->right !=NULL) Hmin->right->left = x; Hmin->right = x; }void FibHeap_Make(FibHeap *H){ H->Num=0; H->min=NULL; //H->maxDegree=0; }void FibHeap_Insert(FibHeap *H,int k){ FibHeapNode *x=new FibHeapNode(k); if(H->min==NULL) H->min=x; else { AddNodeToRootList(H->min,x); if(x->key < H->min->key) H->min = x; } H->Num++; }void FibHeap_Create(FibHeap *H,int A[],int n){ FibHeap_Make(H); for(int i=0;i
执行结果例如以下:

【注:若有错误,请指正~~~~】

你可能感兴趣的文章
利用jquery操作隐藏table某一列
查看>>
jquery lazyload延迟加载技术的实现原理分析
查看>>
springboard 无法启动应用程序(错误 -3)
查看>>
LARGE_INTEGER类型
查看>>
python初级知识与变量
查看>>
Android Screen Orientation
查看>>
从一般分布式设计看HDFS设计思想与架构
查看>>
Coursera Machine Learning Week1
查看>>
bzoj 1263: [SCOI2006]整数划分
查看>>
Linux 命令整理-ps
查看>>
《3+1团队》【Beta】Scrum meeting 2
查看>>
统计分析与R软件-chapter2-6
查看>>
STM32流水灯
查看>>
[2018/11/14] Java学习
查看>>
leetcode371: Sum of 2 Integers
查看>>
css盒子模型
查看>>
python (10) 文件夹的创建与文件夹的删除
查看>>
hdoj 1728 逃离迷宫
查看>>
c# GridView有关RowClick事件,可单击显示选中的row
查看>>
自定义时间选择器调用时报错
查看>>