一种可能的方法是维护两个索引:一个用于时间,另一个用于优先级.让我们以恒定时间的firstKey()/ lastKey()操作获取两个平衡的搜索树.我将使用TreeMap的接口,但是它应该具有类似于c的std :: map的实现(它仅在更新过程中维护对第一个和最后一个元素的迭代器).
第一地图将是地图.任务,第二个-Map< Priority,Integer>.优先事项.每个现有优先级值的第二个映射存储具有该优先级值的任务数.因此,您可以将任务用于第四个查询,将优先级用于第三个查询.
> UpdateTask(t,p)
Priority oldp = tasks.put(t, p);
if (oldp != null) {
decreasePriority(oldp);
}
increasePriority(p);
复杂度:O(log(n))
> DeleteTask(t)
if (tasks.containsKey(t)) {
Priority oldp = tasks.get(t);
tasks.remove(t);
decreasePriority(oldp);
}
复杂度:O(log(n))
> GetMaximumPriority(),GetMinimumPriority()
return priorities.lastKey();
return priorities.firstKey();
复杂度:O(1)(具有正确的lastKey()/ firstKey()实现,带有java.util.TreeMap的O(log(n))).
> GetPriorityofTaskAtMaximumTime()
return tasks.lastEntry().getValue();
复杂度:O(1)(具有正确的lastEntry()实现,带有java.util.TreeMap的O(log(n)))
void increasePriority(p) {
if (priorities.hasKey(p)) {
priorities.put(p, priorities.get(p) + 1);
} else {
priorities.put(p, 1);
}
}
void decreasePriority(p) {
int count = priorities.get(p);
if (count > 1) {
priorities.put(p, count - 1);
} else {
priorities.remove(p);
}
}
结果,您将避免操作中的线性复杂性.