码迷,mamicode.com
首页 > 编程语言 > 详细

算法导论 第十九章:斐波拉契堆

时间:2015-07-18 17:14:13      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:算法导论   斐波拉契堆   提取最小值   势能分析   c++   

   斐波拉契堆是由一组最小堆有序树组成,每棵树遵循最小堆性质,并且每棵树都是有根而无序的。所有树的根通过left和right指针来形成一个环形的双链表,称为该堆的根表。

   对于一个给定的斐波拉契堆H ,可以通过指向包含最小关键字的树根指针H.min来访问。堆中每个节点还包含x.mark,x.degree两个域,x.degree表示x的子女表中的子女个数;x.mark表示从x上次成为另一个节点子女以来是否失掉一个孩子。

斐波拉契对的结构如下:

技术分享

势能函数:

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

           技术分享

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

最大度数:

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

                    技术分享


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

#include<iostream>
#include<cstdlib>
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<n;i++)
		FibHeap_Insert(H,A[i]);
	}
int main()
{
	int test_data[]={52,18,17,38,39,41,3,30,24,26,46,35,7,23};
	int n=sizeof(test_data)/sizeof(int);
	FibHeap *H=new FibHeap();
	FibHeap_Create(H,test_data,n);
	cout<<"Hmin="<<H->min->key<<endl;

		
	return 0;
	}
运行结果如下:

技术分享



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





版权声明:本文为博主原创文章,未经博主允许不得转载。

算法导论 第十九章:斐波拉契堆

标签:算法导论   斐波拉契堆   提取最小值   势能分析   c++   

原文地址:http://blog.csdn.net/u010183397/article/details/46942561

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!