当前位置: 首页 > 知识库问答 >
问题:

二进制堆和优先级队列

卢光誉
2023-03-14

我不熟悉堆,二进制堆,我试图理解为什么我们需要使用二进制堆实现优先级队列。我还了解到二进制堆的底层数据结构也是一个数组。

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

我已经读了这个答案:堆vs二进制搜索树(BST)

共有1个答案

鲜于高明
2023-03-14

可以使用数组表示优先级队列,但这样做会损失很多效率。假设您在数组中插入了某个对象,它的优先级高于队列中的任何对象。它需要转到索引0,索引0处的对象需要转到索引1,依此类推。

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

删除元素具有类似的时间复杂性。

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

 类似资料:
  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 问题内容: 我正在尝试根据文档中提供的示例实现优先级队列。文件:priorityQueue 简而言之,它看起来像这样(不包括所有内容): 该文件中: 如您所见,在与示例进行比较时,我不使用指针,因为这样做会给我一个编译错误,告诉我我的优先级队列未正确实现接口。 这会给我带来以下问题: 该项目未附加到队列中。 我试图写出队列指针地址,它显示了不同的地址。这就解释了为什么它不起作用,但是切片不是地图长

  • 我正在编写一个涉及堆实现的代码,在我的bubbleUp方法中,在我的while循环行中,我似乎遇到了一个取消引用的错误。这可能是一个相当基本的问题,但解决这个问题的最佳方法是什么?我在实现removeHigh方法时也遇到了一些问题,该方法旨在从队列中移除最高的元素。

  • 在我的任务中,我一直在研究一个卫星导航系统,我使用邻接列表来存储所有的地图数据。 因此,我想为我的路径规划函数实现dijkstras算法,但我需要首先实现一个最小优先级队列。使用常规堆可以做到这一点吗,还是需要二进制堆?

  • 我目前正在尝试实现min heap PQ,但是我在实现的正确性方面遇到了一些问题,我似乎无法找出我做错了什么——它没有输出最低优先级,也没有对它们进行正确排序。 使用以下测试数据: 我得到以下结果: 我希望结果是按升序排列的——起初我认为这可能是因为交换了错误的孩子,但最后一个输出是最大的优先级,所以这没有意义。我花了几个小时试图研究堆优先级队列,但我找不到任何帮助。 以下是CMP要求的更好的代码

  • 在前面的部分中,你了解了称为队列的先进先出数据结构。队列的一个重要变种称为优先级队列。优先级队列的作用就像一个队列,你可以通过从前面删除一个项目来出队。然而,在优先级队列中,队列中的项的逻辑顺序由它们的优先级确定。最高优先级项在队列的前面,最低优先级的项在后面。因此,当你将项排入优先级队列时,新项可能会一直移动到前面。我们将在下一章中研究一些图算法看到优先级队列是有用的数据结构。 你可能想到了几种