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

删除相关节点时,从优先级队列中弹出最高值

钱志
2023-03-14

我们能做得更好吗?有没有更好的数据结构可以提供更好的运行时?

共有1个答案

嵇丰
2023-03-14

基本上,您需要的是一个带有附加删除操作的优先级队列。为了以一种有效的方式完成它(也就是说,如果要从队列中移除k个节点,则需要O(k*logn)),您需要节点上的句柄。

通常的方法是使用一个数组将顶点的id与优先级队列中的节点相关联。然后,删除算法取决于实现哪个优先级队列。

我不认为在性能方面可以做得更好,因为另一个由维护排序数组组成的解决方案更昂贵(必须为每次修改维护排序的数组)。

 类似资料:
  • 我正在尝试在滑动窗口中打印最大值。将窗口大小的元素,这里k=3放入优先级队列(Maxheap),然后查看值。”heap.Init(

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 我定义最大优先级队列如下: 我需要理解这是如何工作的,特别是当1只得到2的索引(而不是4)时? 多谢了。

  • 我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: 输入数组的数字将一个接一个地添加到队列中。然而,当数组[12,4,5,3,8,7]是一个样本输入,打印优先队列的输出是: MIN:[3.0, 4.0, 5.0, 12.0, 8.0, 7.0]MAX:[12.0, 8.0, 7.0, 3.0, 4.0, 5.0] 我定义的比较器有什么问题吗?提前感谢你的帮助。

  • 我无法从霍夫曼树中正确弹出。现在我正在基于minheap创建霍夫曼树,我想执行以下操作: 如果我们假设A和B是两个不同的子树,我会说如果A的频率小于B的频率,A将首先被弹出。如果他们有相同的频率,那么我会在A的任何叶节点中找到ASCII值中最小的字符。然后我会看看A中最小的字符叶节点是否小于B的任何叶节点。如果是这样,我会在B之前弹出A。如果不是,我会弹出B。 例如: 假设我输入: 进入我的霍夫曼

  • 问题内容: 在Linux实时进程优先级范围为1到99的情况下,我不清楚哪个是最高优先级,即1或99。 “了解Linux内核”(O’Reilly)的7.2.2节说1是最高优先级,考虑到正常进程的静态优先级从100到139,其中100是最高优先级,这是有道理的: “每个实时过程都与一个实时优先级相关联,该优先级的值范围是1(最高优先级)到99(最低优先级)。” 另一方面,sched_setschedu