通过密钥区分优先级队列堆的时间复杂度

时间:2017-07-02 02:20:03

标签: java heap binary-tree scheduling priority-queue

我有一个优先级队列最大堆,其中每个元素都是一个名为Task的类,其外观如下(用Java实现,但问题与语言无关):

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
}

堆显然按优先级排序。我想要执行的操作是找到优先级最高的项目,减少其Time值,如果时间分数变为0,则将其从堆中删除。但是,这里有一个问题:允许多个任务与同样优先。在这种情况下,我会比较所有此类任务的ID分数,并在最低的任务上运行。

这种操作的最坏情况是什么?如果每个元素具有相同的优先级,我最终会搜索整个树,这意味着这不可能在少于O(n)的时间内完成,对吗?这似乎无法解决,因为ID未分类。但是,我被告知这可以在O(log n)中完成,我完全不明白。有人能够澄清我接近这个错误的地方吗?

1 个答案:

答案 0 :(得分:1)

java.util.PriorityQueueTask个实例)constructor可以Comparator Task#PriorityTask#IDt1(Priority=5, ID=100, Time=10)可以根据(假设)唯一的ID来打破(优先)关系。因此,任务t2(Priority=5, ID=110, Time=10)可以在任务O(log(n))之前(即优先于其)。

删除具有最高优先级的此类项目(位于根目录)以及可能具有相同优先级的其他项目,零剩余时间最低ID仍为O(log n)操作在保持堆属性的同时在堆或优先级队列中。请注意,优先级队列不适合搜索(哈希表或二进制搜索树这样做);但是在保持堆属性的同时插入或删除。您应该使用peekremove API方法来实现所需的操作,同时确保优先级队列的时间复杂度(function scan(obj) { if (obj instanceof Object) { for (var k in obj) { if (obj.hasOwnProperty(k)) { scan(obj[k]); var val = obj[k]; console.log(val.dir + '/' + val.file+ '.'+val.ext + '\n'); } } } } json = [ { "dir": ".github", "nodes": [ { "file": "ISSUE_TEMPLATE", "ext": "md", "data": true } ] }, { "dir": ".vscode", "nodes": [ { "file": "extensions", "ext": "json" }, { "file": "settings", "ext": "json" } ] }, { "dir": "app", "nodes": [ { "dir": "src", "nodes": [ { "dir": "crash", "nodes": [ { "dir": "styles", "nodes": [ { "file": "crash", "ext": "scss" } ] }, { "file": "index", "ext": "tsx" } ] }, { "dir": "lib" }, { "dir": "main-process", "nodes": [ { "dir": "menu", "nodes": [ { "file": "index", "ext": "ts" } ] }, { "file": "main", "ext": "ts" } ] }, { "dir": "models" }, { "dir": "shared-process", "nodes": [ { "file": "index", "ext": "ts" } ] }, { "dir": "ui", "nodes": [ { "file": "index", "ext": "tsx" } ] } ] }, { "dir": "static", "nodes": [ { "dir": "common" }, { "dir": "logos" }, { "file": "error", "ext": "html", "data": true }, { "file": "index", "ext": "html", "data": true } ] }, { "dir": "styles", "nodes": [ { "dir": "mixins" }, { "dir": "ui", "nodes": [ { "file": "_app-menu-bar", "ext": "scss" }, { "file": "_focus", "ext": "scss" }, { "file": "_title-bar", "ext": "scss" } ] }, { "file": "_globals", "ext": "scss" }, { "file": "_mixins", "ext": "scss" }, { "file": "_type", "ext": "scss" }, { "file": "_ui", "ext": "scss" }, { "file": "_variables", "ext": "scss" }, { "file": "_vendor", "ext": "scss" }, { "file": "appname", "ext": "scss" } ] }, { "dir": "test" }, { "file": "package", "ext": "json", "data": true }, { "file": "webpack.common", "ext": "js" }, { "file": "webpack.development", "ext": "js" }, { "file": "webpack.production", "ext": "js" } ] }, { "dir": "docs", "nodes": [ { "dir": "contributing", "nodes": [ { "file": "setup", "ext": "md" }, { "file": "styleguide", "ext": "md" }, { "file": "tooling", "ext": "md" }, { "file": "troubleshooting", "ext": "md" } ] }, { "dir": "process", "nodes": [ { "file": "issue-triage", "ext": "md" }, { "file": "releasing-updates", "ext": "md" }, { "file": "reviews", "ext": "md" }, { "file": "roadmap", "ext": "md" } ] }, { "dir": "technical" }, { "file": "installation", "ext": "md" }, { "file": "README", "ext": "md" } ] }, { "dir": "script", "nodes": [ { "file": "build" }, { "file": "debug" }, { "file": "dist-info", "ext": "js" }, { "file": "package" }, { "file": "publish" }, { "file": "run", "ext": "js" }, { "file": "start" } ] }, { "file": ".gitmodules" }, { "file": ".travis", "ext": "yml" }, { "file": "appveyor", "ext": "yml" } ] scan(json))。