zoukankan      html  css  js  c++  java
  • 算法导论 第十九章:斐波拉契堆

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

    全部树的根通过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<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;
    	}
    
    执行结果例如以下:



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





  • 相关阅读:
    Robotium源码分析之Instrumentation进阶
    路飞学城Python-Day115
    路飞学城Python-Day114
    路飞学城Python-Day113
    【逻辑回归的特征筛选方法】
    路飞学城Python-Day108
    路飞学城Python-Day107
    【算法学习】神经网络
    路飞学城Python-Day100
    路飞学城Python-Day101
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7047304.html
Copyright © 2011-2022 走看看