当前位置: 首页 > 面试题库 >

当Java PriorityQueue的元素更改优先级时更新

禄源
2023-03-14
问题内容

我正在尝试使用来使用PriorityQueue排序对象Comparator

这很容易实现,但是对象类变量(比较器用来计算优先级)在初始插入后可能会更改。大多数人提出了一种简单的解决方案,即删除对象,更新值并再次将其重新插入,因为这是优先级队列的比较器投入使用的时候。

除了围绕PriorityQueue创建包装器类之外,还有其他更好的方法吗?


问题答案:

你必须删除并重新插入,因为队列的工作原理是在插入新元素时将它们放置在适当的位置。这比每次退出队列时查找优先级最高的元素的替代方法要快得多。缺点是插入元素后无法更改优先级。TreeMap具有相同的限制(与HashMap一样,在插入后其元素的哈希码更改时也会中断)。

如果要编写包装器,可以将比较代码从入队移到出队。你不再需要在入队时间进行排序(因为如果允许更改,它创建的顺序将始终不可靠)。

但这会导致性能变差,并且如果你更改任何优先级,都希望在队列上进行同步。由于在更新优先级时需要添加同步代码,因此你也可能只需要出队和入队(在两种情况下都需要引用队列)。



 类似资料:
  • 我在这个问题上发现了一些类似的问题,但我想再问一遍,以便得到一个更明确的答案。我正在编写一个图匹配算法,其中图上的每个节点分配给一个优先级集,取决于其邻居的匹配。细节其实并不重要,但我使用了std::priority_queue以便首先匹配最高优先级的节点。这里有一个棘手的问题:每次引入一个新的匹配,匹配节点的邻居的优先级将被更新。 我的问题自然是,如何更新新匹配的顺序?我能强制执行吗?或者是否有

  • 我有一个在Google Cloud DataFlow上运行的Beam作业从BigQuery读取数据。当我运行作业时,作业需要几分钟的时间才能开始从(微小)表读取数据。结果表明,数据流作业发送的是一个BigQuery作业,该作业以批处理模式运行,而不是以交互模式运行。如何切换到在Apache Beam中立即运行?我在API中找不到一个方法来更改优先级。

  • 我正在寻找一种通过优先级和先到先服务(FCFS)调度线程的方法,如果两个线程具有相同的优先级。我在考虑使用一堆队列或类似的东西。问题是,即使我实现了自己的优先级队列,更改优先级的能力也会破坏插入到该队列的顺序。

  • 我有一个priority_queue,我想修改它的一些内容(优先级值),那么这个队列会被使用吗? 这取决于它是使用Push/Pop(更有可能,因为你只需要“插入”,而不是整个使用),还是访问top或Pop。 我很想更改队列中的一些元素。大概是这样的:

  • 我想知道,一旦对象被删除并重新插入队列以更新其优先级,是否无论如何都要保持优先级队列中对象的优先级? 我这样做的方法是从优先级队列中删除对象,并将更新后的对象再次放入队列中。然而,这将破坏我使用<code>比较器实现的自然排序 <代码>比较器 : 例如 按以下顺序插入:约翰、亚历克斯、科比、简 优先级队列的形式如下:[Jane,100],[Kerby,59],[Alex,33],[John,13]

  • 问题内容: 我有一个Python程序,它执行耗时的计算。由于它使用高CPU,并且我希望系统保持响应状态,因此我希望程序将其优先级更改为低于正常值。 我发现了这一点: 在Windows中设置进程优先级- ActiveState 但我正在寻找一种跨平台的解决方案。 问题答案: 这是我用来将进程设置为低于正常优先级的解决方案: 在Windows和Linux上的Python 2.6上进行了测试。