Binomial Heap

来源:互联网 发布:广州软件开发招聘 编辑:程序博客网 时间:2024/06/03 13:28

        花一下午写的一个二项堆的C++实现,思想源自Robert Sedgewick 的 Algorithms in C。

 

        首先说下性能。复杂度没什么好说的,merge, push, pop, top, size, empty 都是O(lgn),下面讲一下本机测试的数据。

 

        (host) Pent. dual-core t3200, 2G hz, 2G ram, (OS) linux 2.6.32,(compiler) gcc 4.5.2

 

        输入 0~n-1的自然数,n = 100000000,一亿

 

        n次push很快,7秒,因为是链式树的实现,甚至比std::priority_queue还要快,后者10秒,但是pop就太不堪了,为标准库的2倍多,

 

        n次push后的析构,花 4秒,唉,都超过push的一半了,std::priority_queue是随机访问序列的适配器,其析构自然是瞬杀了。

 

        这样比起来,其实也很一般。

 

        好吧,我知道不能这么比,二项堆就是二项堆,全O(lgn)操作的数据结构,最主要的是merge。

 

       不得不说,Mr. Sedgewick 的算法解说非常棒,但是其代码,真的太那个了。下面贴出代码,以私有方法insert为主体,模仿二进制加法进行合并式插入。

 

       (PS. 按Mr. Sedgewick描述的,以简单的二的幂堆的集合为基础进行实现。翻了下算法导论,里面的图解很晕人,没仔细研究,也不知用的什么方法)