二项队列与二叉堆的比较

导语

二叉堆确实是入门级的重要数据结构了,而二项队列也是慢慢要去掌握的一种支持高效合并的优先队列实现。本文稍作比较,望抛砖引玉。

列个表格比较基本操作性能

基本操作 insert(平均) deleteMin/deleteMax merge
二项队列 O(1) O(logN) O(logN)
二叉堆: O(1) O(logN) O(N)

不难看出,二项队列merge操作优势明显。

二叉堆插入O(1)的解释如下

说明:二叉堆插入也是 O(1) 这点,我其实原本不太敢写,因为网搜确实都写是O(logN),但大家这么想就能理解了(因为我们说的是平均情况):
二叉堆建堆的时间复杂度是O(N),除以逐一插入的N个元素,就平均是O(1)。
准确地说,O(logN)其实是最坏情况。

Merge操作的性能比较

对于二项队列而言,它可以弥补二叉堆的在合并操作上的“低效”。
二叉堆的合并操作的时间复杂度为O(N),而二项队列的合并操作的最坏时间复杂度为O(logN),这就有了很大的性能优化。

二项队列合并O(logN)的解释如下

合并操作是指将两个二项队列合并,合并这两个二项队列中高度相同的二项树。
对于N个结点的二项队列,最多只有log2N棵二项树。而合并操作就是合并两棵高度相同的二项树,所以保证了最坏O(logN)。

空间性能比较

尽管在 insertdeleteMin/deleteMax 操作,二者平均性能差不多,且 merge 操作上二项队列有明显优势,但也不能说二项队列就是最优选择。二项队列的编码比二叉堆复杂很多,且还有这里要分析的空间损耗。

我们也知道二叉堆虽说是完全二叉树,但存储结构使用的是一个简单的动态数组,它只需要一个一维数组即可存储各个元素,空间上较为优化。

但二项队列是森林,编程实现还用到了链表,树中的每个元素存储在一个结点中,结点之间采用“左孩子右兄弟”表示法进行链接,此外还需要一个额外的数组来保存各棵二项树的根结点,存储开销要比二叉堆大。

发布了570 篇原创文章 · 获赞 1179 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104459212