Binomial Heap

本文介绍了在比较Dijkstra算法配合不同优先队列效率的过程中,作者亲自动手实现Binomial Heap,探讨其优缺点。Binomial Heap操作复杂度为O(logn),由二项树链表构成,主要依赖于merge方法。尽管其应用不如其他数据结构广泛,但因其独特的结构在教材中占有一定地位。实验证明,Dijkstra+Binomial Heap在某些情况下表现可与普通堆媲美甚至更优。
摘要由CSDN通过智能技术生成

最近在比较Dijkstra+各种优先队列组合的效率。

这个想法源于算法课的作业。作业要我们用现成的库(LEDA)来比较。我比较出来的结果和预期相差甚远,怀疑是不是库的问题。

于是,这次我亲手写了所有的代码,再比较一次。

Binomial Heap虽然经常被各种教科书提到,不过实际应用不是很多。

理由很简单:他没有堆简单,也没有斐波那契堆高效。

然而,优美的结构(虽然不是很容易实现,可能是我写的不好)让它在各个教材中都占有一席之地。

 

Binomial Heap所有操作复杂度都是O(logn)的。

一个Binomial Heap是一个“二项树”的链表,几乎所有操作都基于merge方法。

每个节点都用“做孩子又兄弟”表示(这样表示似乎可以减少指针的浪费:正常表示方法中大量叶节点都是null,而左孩子右兄弟表示中null出现次数减少了一半,因为叶节点只有一个指针指向null)

以前用vector写过一个Binomial Heap,感觉有些山寨。这次正儿八经的用linked list写了一遍。

merge方法说起来简单,其实却相当难写……不知道有啥简洁的实现方法不。

delete min方法讲起来也很简单,不过merge之前要把chid的链表反向一下,因为child链表中元素的degree是递减的。

 

目前实验结果表明dijkstra+Binomial Heap的表现几乎和普通堆持平,有时候甚至超过普通堆。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值