如何在修改队列内容后从优先级队列中获取最小元素

时间:2015-06-14 05:25:00

标签: java algorithm priority-queue dijkstra

我试图在Java中使用priority queue来实现Dijkstra的算法。 不幸的是,它返回了错误的结果......我已经找到了问题所在。 这是问题。在将节点权重插入队列之后,我正在修改那些节点权重,但是当我尝试从优先级队列中删除该元素时,它返回历史最小值(插入时的最小值)。{{ 1}}不知道优先级队列已被修改。任何帮助将不胜感激...谢谢!

注意:我可以根据需要添加源代码

3 个答案:

答案 0 :(得分:1)

This所以问题可以帮到你。 Java中PriorityQueue的缺点是,如果插入的元素值发生更改,则不会重新构造优先级队列以反映新的顺序。因此,您必须删除并重新插入更改元素以满足您的使用案例。

答案 1 :(得分:1)

标准接口不提供更新功能。您已使用实现此的自定义类型。这是因为,如标题为S.O的文章所述," Updating Java PriorityQueue when its elements change priority":

  

您必须删除并重新插入,因为队列的工作方式是在插入新元素时将其放入适当的位置。

这对你有何影响,请参阅S.O帖子," Java Priority Queue reordering when editing elements":

  

每当添加或删除元素时,优先级队列都不会求助所有元素....这样做太昂贵了。 PriorityQueue不提供api来通知它有关已更改的节点,因为这将要求它提供有效的节点查找,而其基础算法不支持。

上述帖子为您实施Dijsktra算法提供了替代方法。

如果您有任何疑问,请与我们联系!

答案 2 :(得分:0)

就像Map的键一样,放在PriorityQueue中的元素需要是不可变的。插入PriorityQueue的元素将与PriorityQueue中的所有现有元素进行比较。因此,如果基础元素发生变化,您的PriorityQueue很可能无法保留不变量。

您可以使用的替代数据结构可以是TreeSetremove的{​​{1}}操作为O(lg N)。