【问题标题】:Binary Heap and Priority Queues二叉堆和优先级队列
【发布时间】:2017-10-18 20:29:05
【问题描述】:

我是堆和二进制堆的新手,我想了解为什么我们需要使用二进制堆来实现优先级队列。我也明白二进制堆的底层数据结构又是一个数组。

所以我的问题是为什么我们不能使用按降序(对于最大堆)或升序(对于最小堆)排序的数组来表示优先级队列?我在这里可能错了,但我认为如果以这种方式实现,findMax、findMin、insert 和 delete 等操作的时间复杂度将几乎保持不变。那么我们不能不使用排序数组来表示优先级队列吗?

我已经阅读了这个答案:Heap vs Binary Search Tree (BST)

【问题讨论】:

  • @Alexander 太棒了

标签: algorithm tree heap priority-queue binary-heap


【解决方案1】:

您可以使用数组来表示优先级队列,但是这样做会损失很多效率。想象一下,你在一个数组中插入了一些东西,它的优先级比队列中的任何对象都高。它需要进入索引 0,索引 0 处的对象需要进入索引 1,依此类推。

这是 O(n),但是如果你在由二叉树组成的优先级队列的前面插入一个值,你只需要改变 lg(n) 个节点,使得二叉树在建模优先级队列方面比数组是。

删除元素的时间复杂度相似。

如果用数组实现,访问优先级队列的后面是恒定时间,但如果用二叉树实现,则需要 O(n) 时间,因此这是数组优于二叉树的显着优势,但优先级队列在一般不需要在很多时候访问优先级最低的元素,因此二叉树通常比数组更有效地表示优先级队列。

【讨论】:

  • 谢谢。我现在不知何故错过了数组需要 O(n) 时间来重新排列元素而 Tress 通常需要 log(n) 的最基本的东西。感谢您的澄清。
猜你喜欢
  • 2013-11-30
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 2018-12-24
  • 1970-01-01
  • 2013-09-30
相关资源
最近更新 更多