我正在开发一个事件驱动的模拟器,我的事件都在java.util.PriorityQueue中。问题是事件在运行时被重新安排,并且由于库存优先级中没有更新优先级,我删除元素并使用新优先级重新插入它们。
这样可行,但性能太差,而且不能很好地扩展。 JVisualVM的分析器告诉我99%的时间浪费在pq.delete(...)中。
是否有PQ的实现有效地更新优先级,或者至少有一个PQ的实现,其中删除(...)比来自库存的O(N)更有效?
我尝试了一个Fibonacci堆,它在某个点上运行得更快,但也不能很好地扩展。
答案 0 :(得分:0)
这是一个队列解决方案:不要从队列中删除而是维护一个单独的队列。每当你需要改变优先级时,你只需要形成一个新队列并用它替换原来的队列。
为避免潜在的并发问题,您应该在某个时刻阻止读者/编写者重新分配队列。