花一下午写的一个二项堆的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描述的,以简单的二的幂堆的集合为基础进行实现。翻了下算法导论,里面的图解很晕人,没仔细研究,也不知用的什么方法)