ich eine benutzerdefinierte Task-Klasse haben, die einen Prioritätswert sowie einige zusätzliche Felder enthält, wie unten gezeigt:Verbesserung der Key Suche Zeitkomplexität in einer Prioritätswarteschlange Heap
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
}
Diese in einem max Heap nach Priorität gespeichert werden das funktioniert gut. Allerdings, wenn ich will ein Task-Objekt mit einem bestimmten ID-Wert finden, die in O (n) Zeit aufgrund der linearen Suche (unter Verwendung eine grundlegende Reihe von Aufgaben als Heap) getan werden muss:
public int getTimeOfID(int ID){
for(int i = 1; i < heapSize+1; i++){
if (heap[i].getTaskID() == taskID){
return heap[i].getTimeLeft();
}
}
return -1;
}
Ich habe mehrere Verweise auf einen "modifizierten Heap" gefunden, der verwendet werden könnte, um die ID-Suche auf O (1) -Zeit zu verbessern, aber kein konkretes Implementierungsbeispiel gefunden. Ist das möglich, und wenn ja, wie würde ich es tun? Ein Java- oder Pseudocode-Beispiel würde sehr geschätzt werden, aber auch nur der Name einer relevanten Datenstruktur, um mit meiner Suche zu beginnen, wäre hilfreich. Danke für jegliche Hilfe.
EDIT: Zusätzlicher Code hinzugefügt wie gewünscht:
//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.
zeigen Sie die aktuelle Initialisierung und Verwendung des maxHeap –
Speichern Sie Ihre Objekte in 'HashMap' neben' PriorityQueue' – talex
@GiladGreen Added – Chase