我有一个自定义任务类,其中包含优先级值以及一些附加字段,如下所示:
class Task{
int ID;
int Priority;
int Time;
public Task(int i, int p, int t){
this.ID = i;
this.Priority = p;
this.Time = t;
}
//Getters, etc
}
这些按优先级存储在最大堆中,效果很好。但是,如果我想找到具有特定 ID 值的 Task 对象,由于线性搜索(使用基本的 Tasks 数组作为堆),必须在 O(n) 时间内完成:
public int getTimeOfID(int ID){
for(int i = 1; i < heapSize+1; i++){
if (heap[i].getTaskID() == taskID){
return heap[i].getTimeLeft();
}
}
return -1;
}
我遇到了几个对“修改堆”的引用,可用于将 ID 搜索改进到 O(1) 时间,但还没有找到具体的实现示例。这可能吗,如果可以,我该怎么做?非常感谢 Java 或伪代码示例,但即使只是相关数据结构的名称来开始我的搜索也会有所帮助。感谢您的任何帮助。
编辑:按要求添加的附加代码:
//initial variables
private Task[] heap;
private int heapSize, capacity;
int maxTasksHigh;
//Constructor
public PQ(int maxTasks){
this.capacity = maxTasks+1;
heap = new Task[this.capacity];
heapSize = 0;
maxTasksHigh = maxTasks;
}
//Addition
public void add(int ID, int time){
Task newTask = new Task(ID, time);
heapSize++;
heap[heapSize] = newTask;
int target = heapSize;
heap[target] = newTask;
reorder(target);
}
//etc.