更新元素后重新生成java.util.PriorityQueue

时间:2011-12-29 03:11:01

标签: java priority-queue

我有一个包含对某些对象的引用的PriorityQueue。当我最初将元素插入优先级队列时,排序由数据结构维护。现在,在删除操作之后,我更新了优先级队列所持有的一些引用。理想情况下,这需要对优先级队列进行重新调整操作,但很明显,因为我在外部修改了所选引用,因此无法触发重新调整。那么,在存在对队列中任意元素的修改的情况下,确保我能够像快速提取最大值那样获得堆的优势的最佳方法是什么?我看到我需要一个更好的数据结构?

更具体地说,我需要在Java中实现像Fibonacci堆这样的东西。 http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm 可以吗?

2 个答案:

答案 0 :(得分:2)

您可以使用自己的树,允许重复元素而不是堆。 但是更容易,您可以使用TreeMap<PriorityKey, LinkedHashSet<Value>>。 所有操作都是O(log priorityType):

  • 添加为get(priority).add(value),如果get返回null,则为put(priority, new LinkedHashSet())
  • 删除任意元素是类似的,但如果Set为空则需要从地图中删除优先级。
  • poll()

-

Entry<PriorityKey, LinkedHashSet<Value>> e = map.firstEntry(); 
if (e==null) return null; 
Iterator<Value> i = e.getValue().iterator(); 
Value v = i.next(); //must always have at least one element.
i.remove(); 
if (!i.hasNext()) map.remove(e.getKey());
return v;

如果您需要更改优先级,则必须删除并添加元素。

答案 1 :(得分:1)

也许NavigableMap可以满足您的需求:轻松识别“最高”或“最低”元素,快速插入和访问时间,您可以轻松更新值。

http://docs.oracle.com/javase/7/docs/api/java/util/NavigableMap.html

TreeMap实现了NavigableMap,因此提供了firstEntry / lastEntry方法等等。