具有高效删除(或)更新的Java优先级队列

时间:2016-01-31 20:05:18

标签: java queue

我正在开发一个事件驱动的模拟器,我的事件都在java.util.PriorityQueue中。问题是事件在运行时被重新安排,并且由于库存优先级中没有更新优先级,我删除元素并使用新优先级重新插入它们。

这样可行,但性能太差,而且不能很好地扩展。 JVisualVM的分析器告诉我99%的时间浪费在pq.delete(...)中。

是否有PQ的实现有效地更新优先级,或者至少有一个PQ的实现,其中删除(...)比来自库存的O(N)更有效?

我尝试了一个Fibonacci堆,它在某个点上运行得更快,但也不能很好地扩展。

1 个答案:

答案 0 :(得分:0)

这是一个队列解决方案:不要从队列中删除而是维护一个单独的队列。每当你需要改变优先级时,你只需要形成一个新队列并用它替换原来的队列。

为避免潜在的并发问题,您应该在某个时刻阻止读者/编写者重新分配队列。