【发布时间】:2018-05-10 08:06:32
【问题描述】:
我编写了这个方法来测试我的优先级队列,它有一个 ArrayList 和一个 Comparator 作为参数:
@Test
public void testPriorityQueue_ExtractMax() {
PriorityQueue queue = new PriorityQueue(new IntegerComparator());
Integer[] arrayExp={14, 9};
queue.insert(16);
queue.insert(9);
queue.insert(14);
queue.extractMax();
assertArrayEquals(arrayExp, queue.getArray().toArray());
}
现在,如果我执行它,它会说我的结果中的第一个元素是 9,但我必须是 14(我的队列的新根)。这些是 extract max 和 heapify 方法。我该如何解决?
public void heapify(int index) {
int largest = index;
int leftIndex = 2 * index + 1;
int rightIndex = 2 * index + 2;
if (leftIndex < queue.size() && c.compare(queue.get(index), (queue.get(leftIndex))) < 0)
largest = leftIndex;
if (rightIndex < queue.size() && c.compare(queue.get(largest), queue.get(rightIndex)) < 0)
largest = rightIndex;
if (largest != index) {
swap(index, largest);
heapify(largest);
}
}
public T extractMax() {
if (queue.size() == 0) return null;
T min = queue.get(0);
queue.remove(0);
queue.set(0, queue.get(queue.size() - 1));
heapify(0);
return min;
}
这是整数比较器:
public class IntegerComparator implements Comparator<Integer>{
@Override
public int compare(Integer l1, Integer l2) {
int result = l1.compareTo(l2);
if(result != 0)
return result;
return -1;
}
}
EDIT_2:这是我的插入方法,会不会是问题:
public void insert(T elem) {
int i = queue.size();
int parentIndex = (i - 1) / 2;
while (i > 0 && c.compare(elem, queue.get(parentIndex)) == 1) {
queue.set(i, queue.get(parentIndex));
i = parentIndex;
parentIndex = (i - 1) / 2;
}
queue.add(i, elem);
}
【问题讨论】:
-
这取决于
IntegerComparator如何对元素进行排序(最小堆或最大堆)。检查它是如何实现的。 -
我在问题中添加了它。