插入 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结点之前(循环