提高优先级队列堆中的密钥搜索时间复杂度

时间:2017-07-04 17:24:37

标签: java algorithm data-structures priority-queue max-heap

我有一个自定义的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.

1 个答案:

答案 0 :(得分:3)

您可以做的是添加HashMap以在最大堆中的IDTask对象之间进行映射。

然后,在添加或删除项目时,您可以从HashMap<String, Task>添加或删除项目。这些操作将花费O(1),因此不会损害Max Heap的时间复杂度。除了最大堆之外,您还可以使用HashMap检查是否存在给定的ID,并在O(1)中检索其项目。

提醒:如果通过这些额外的方法返回对Max Heap中对象的引用,则局外人可以更改项的值,从而打破Max Heap。通过返回对象的深层克隆或让Task不可变。

来解决此问题

添加代码后更新:

  • 创建HashMap<String, Task>类的新成员 在构造函数中初始化它。
  • 在添加方法中,检查给定a.containsKey()的{​​{1}}是否为Task。如果没有将其添加到最大堆和HashMap
  • 根据需要更新其他方法的逻辑。