我有一个自定义的Task类,它包含一个优先级值以及一些其他字段,如下所示:
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对象,由于线性搜索(使用任务的基本数组作为堆),必须在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;
}
我偶然发现了一些对#34;修改过的堆&#34;可以用来将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.
答案 0 :(得分:3)
您可以做的是添加HashMap
以在最大堆中的ID
和Task
对象之间进行映射。
然后,在添加或删除项目时,您可以从HashMap<String, Task>
添加或删除项目。这些操作将花费O(1)
,因此不会损害Max Heap的时间复杂度。除了最大堆之外,您还可以使用HashMap
检查是否存在给定的ID
,并在O(1)
中检索其项目。
提醒:如果通过这些额外的方法返回对Max Heap中对象的引用,则局外人可以更改项的值,从而打破Max Heap。通过返回对象的深层克隆或让Task
不可变。
添加代码后更新:
HashMap<String, Task>
类的新成员
在构造函数中初始化它。a.containsKey()
的{{1}}是否为Task
。如果没有将其添加到最大堆和HashMap
。