斐波那契堆 插入、 Extract-Min(查找+删除)效率与 STL优先队列对比

插入 n个随机数据,取m次最小值并pop掉

n=10000000(一千万),m=0 (纯插入,一个o1,一个logn)

fib:耗时8377ms

stl:耗时5086ms


n = 5000000(五百万), m=20000(2万) 

fib:耗时4945ms

stl:耗时2605ms


n = 5000000(五百万), m=2000000(2百万) 

fib:耗时15148ms

stl:耗时6069ms


 

n = 5000000(五百万), m=0() 

fib:耗时4290ms

stl:耗时2590ms


以上的随机数据用rand()函数生成,测试环境是WIN7+I5笔记本

可以看出 在  这个规模下的  即使斐波那契堆的插入是 o(1),也并不能带来特别明显的优势

原因可能如下,

1.这个fib是用  分散式内存实现的,(新加入的加点是用new获取内存,这可能是一大原因)

2.fib堆本身操作常数因子就比较大,所以这个小规模下的数据并不能体现出复杂度的优势  (o1 -  lgn

3.代码写得太挫了。。。有时间自己再实现一遍吧




以下附上所用的fib代码: (网上找的+自己修改勉强跑起来的)

//说明:
//代码中Fibonacci Heap 用变量heap表示
//结点通常用x,y等表示
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<climits>
#include<windows.h>
#include<time.h>
#include<vector>
using namespace std;
struct node
{
	int ff;
	int x,v;
	node(){}
	node( int a,int b)
	{ x=a;v=b;}
	node(int c,int a,int b)
	{ff=c;x=a;v=b;}
	bool operator<(const node&b )const
	{
		return v<b .v;
	}
	bool operator>(const node&b )const
	{		return v>b.v; 
	}
	bool operator==(const node&b )const
	{
		return (v==b.v)&&(x==b.x);
	}
};
node int_MIN;

//斐波那契结点ADT
struct FibonacciHeapNode {
    node key;       //结点
    int degree;    //度
    FibonacciHeapNode * left;  //左兄弟
    FibonacciHeapNode * right; //右兄弟
    FibonacciHeapNode * parent; //父结点
    FibonacciHeapNode * child;  //第一个孩子结点
    bool marked;           //是否被删除第1个孩子
};

typedef FibonacciHeapNode FibNode;

//斐波那契堆ADT
struct FibonacciHeap {
    int keyNum;   //堆中结点个数
    FibonacciHeapNode * min;//最小堆,根结点
    int maxNumOfDegree;   //最大度
    FibonacciHeapNode * * cons;//指向最大度的内存区域
};

typedef FibonacciHeap FibHeap;

/*****************函数申明*************************/
//将x从双链表移除
inline void FibNodeRemove(FibNode * x);

//将x堆结点加入y结点之前(循环
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值