我正在尝试编写一个名为HeapQueue
的类。我将根节点的左子节点存储在索引为2 * indexOfRoot + 1
的位置,右子节点存储在2 * indexOfRoot + 2
的位置。
public class HeapQueue implements PriorityQueue, BinaryHeap {
public List<Task> queue;
public Comparator comparator;
public HeapQueue() {
queue = new ArrayList();
}
public void setComparator(Comparator comparator) {
this.comparator = comparator;
heapify(0);
}
public Comparator getComparator() {
return comparator;
}
public void offer(Task task) {
int currentElement, previousElement;
queue.add(task);
currentElement = queue.size() - 1;
previousElement = (currentElement - 1) / 2;
while (previousElement >= 0 &&
getComparator().compare(queue.get(currentElement), queue.get(previousElement)) > 0) {
swap(currentElement, previousElement);
currentElement = previousElement;
previousElement = (currentElement - 1) / 2;
}
}
private void swap(int i, int j) {
Task t1 = queue.get(i);
Task t2 = queue.get(j);
Task t3 = t1;
queue.set(i, t2);
queue.set(j, t3);
}
}
队列存储对象 Task
。
public class Task {
private final String name;
private final int priority;
public Task(String name, int priority) {
this.name = name;
this.priority = priority;
}
public int getPriority() {
return priority;
}
@Override
public String toString() {
return name + "\tpriority = " + priority;
}
}
我有一个名为 heapify()
的方法,在 HeapQueue
中:
public void heapify(int root) {
int leftChild, rightChild;
leftChild = 2 * root + 1;
if (leftChild < queue.size()) {
rightChild = leftChild + 1;
if ((rightChild < queue.size())
&& getComparator().compare(queue.get(rightChild), queue.get(leftChild)) > 0) {
leftChild = rightChild;
}
if (getComparator().compare(queue.get(leftChild), queue.get(root)) > 0) {
swap(root, leftChild);
heapify(leftChild);
}
}
}
在将任务添加到队列后,可以通过方法setComparator()
更改我的任务比较器。
默认的Comparator
是:
public class Comparator{
public int compare(Task t1, Task t2) {
if (t1.getPriority() == t2.getPriority()) {
return 0;
} else if (t1.getPriority() < t2.getPriority()) {
return -1;
} else {
return 1;
} //sorting max
}
}
作为另一个比较器的例子可能是:
public class otherComparator{
public int compare(Task t1, Task t2) {
if (t1.getPriority() == t2.getPriority()) {
return 0;
} else if (t1.getPriority() < t2.getPriority()) {
return 1;
} else {
return -1;
} //sorting min
}
}
我创建了一个
HeapQueue
并添加了一些元素。HeapQueue heap = new HeapQueue();
heap.setComparator(comparator);
Task t1 = new Task("a", 1);
Task t2 = new Task("b", 2);
Task t3 = new Task("c", 3);
Task t4 = new Task("d", 4);
System.out.println(heap.queue.toString());
结果是:
[d priority = 4, c priority = 3, b priority = 2, a priority = 1]
4
/ \
3 2
/
1
是的,但是当我将 Comparator
改为 otherComparator
:
otherComparator newComparator = new otherComparator();
heap.setComparator(newComparator);
System.out.println(heap.queue.toString());
结果是:
[b priority = 2, c priority = 3, d priority = 4, a priority = 1]
2
/ \
3 4
/
1
这是错误的。正确的答案应该像这样:
[a priority = 1, b priority = 2, c priority = 3, d priority = 4]
1
/ \
2 3
/
4
我认为我在使用heapify()
函数时遇到了问题,但我找不到错误。有人可以帮忙吗?
otherComparator
设置为堆的比较器呢?它没有实现相同的接口啊。 - Pham Trung