优先级队列,可比较

时间:2010-10-08 18:45:08

标签: java algorithm

我必须编写一个优先级队列作为以下接口的实现:

public interface PQueue<T extends Comparable<T>> {
   public void insert( T o );  // inserts o into the queue
   public T remove();          // removes object with highest priority (by natural order)
}

我很乐意提供一些帮助和线索,因为我甚至不知道如何从这个问题开始。

3 个答案:

答案 0 :(得分:1)

我会从这样的事情开始。一般的想法是你有一个内部列表,当你插入一个新项目时,你做一个二进制搜索,以找到它在该列表中的位置。这样你的内部列表总是被排序,所以当你调用remove()时,你只需要取最后一个(或者首先取决于你的订购方式)项目。

免责声明:这应该被视为伪代码。我知道它有问题。它只是一个起点。

public class PQueueImpl<T> implements PQueue<T> {
   private List<T> internalQueue;

   public void insert(T item){
      int insertionPoint = Collections.binarySearch(internalQueue, item);
      internalQueue.add(insertionPoint, item);
   }

   public T remove(){
      return internalQueue.remove(internalQueue.size() - 1);
   }
}

答案 1 :(得分:0)

您可以查看java.util.PriorityQueue的源代码。它们的实现由Object数组支持,并且比我给出的其他示例复杂得多,但我确信它的工作原理和性能都要好得多。

答案 2 :(得分:0)

优先级队列实际上最常用的是heaps。它们也可以实现为平衡的binary search tree或任何其他快速排序的数据结构。关键是数据结构必须具有非常快(比O(n))最大/最小,插入,删除和更新操作。