我必须编写一个优先级队列作为以下接口的实现:
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)
}
我很乐意提供一些帮助和线索,因为我甚至不知道如何从这个问题开始。
答案 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))最大/最小,插入,删除和更新操作。