我现在正在考试,并在样本考试中遇到了这个问题:
阻止优先级队列的实施
如果我们事先知道优先级队列只需要满足少量离散优先级(比如说10),我们就可以通过将优先级队列表示为一个数组来实现优先级队列的所有操作。队列 - 每个队列存储单个优先级的元素。请注意,虽然优先级队列中的优先级数可能是线性的,但操作对于整个数据结构的大小仍然是不变的。
存储在此优先级队列中的对象无法比较。
我已经尝试了但是我很遗憾我应该如何为阵列实现优先级队列分配优先级。
我也尝试过寻找解决方案,但我设法找到的只是使用Comparable的例子,我们在本课程中没有学到。
答案 0 :(得分:0)
每个阵列都对应不同的优先级。您的最低级别优先级数组将仅处理该优先级别的对象。您的最高级别优先级数组将处理具有最高优先级的对象,依此类推。收到新对象时,将其放入与其优先级对应的数组中。
然而,对象不具有可比性,因为它们是根据数组的分层按优先级排序的。然后,当您要查找要执行的下一个元素时,检查优先级最高的数组并查看是否有任何元素;如果没有,移动到下一个优先级,依此类推。通过每个数组。
我希望我能正确理解问题和你的问题;如果您对我的回答有任何其他问题,请与我联系。
答案 1 :(得分:0)
关注Imcphers'回答,这将是Java中的一个简单实现。请注意,您不需要Comparable
,因为enqueue
需要额外的参数,即新添加元素的离散优先级:
public class PQueue<T> {
public static final int MAX_PRIORITIES = 10;
private ArrayList<ArrayDeque<T> > queues = new ArrayList<>();
public PQueue() {
for (int i=0; i<MAX_PRIORITIES; i++) {
queues.add(new ArrayDeque<T>());
}
}
public void enqueue(int priority, T element) {
// ... add element to the end of queues[priority]
}
public T dequeue() {
// ... find first non-empty queue and pop&return its first element
}
// ... other methods
}
这里,enqueue()和dequeue()都是O(1),因为您事先知道可以有多少优先级,以及它们的值是什么(0到MAX_PRIORITIES-1),因此不需要排序,并且搜索非空队列是恒定时间(最多,MAX_PRIORITIES队列必须测试空白)。如果这些参数未知,最好的实现将使用
private TreeSet<ArrayDeque<T extends Comparable> > queues
= new TreeSet<>(CustomComparator);
CustomComparator
要求队列根据其第一个元素的自然顺序排队,并且需要在每次调用enqueue
后对这些内部队列进行排序 - 这会增加复杂性入队/出队到O(log p),其中 p 是不同优先级的数量(因此,内部队列)。
请注意,Java的PriorityQueue属于相同的复杂性类,但通过实现自己的内部priorty堆,避免了TreeSet
/ ArrayDeque
包装器提供的所有对象开销。