我有一个优先级队列最大堆,其中每个元素都是一个名为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)中完成,我完全不明白。有人能够澄清我接近这个错误的地方吗?
答案 0 :(得分:1)
java.util.PriorityQueue
(Task
个实例)constructor可以Comparator
Task#Priority
,Task#ID
和t1(Priority=5, ID=100, Time=10)
可以根据(假设)唯一的ID来打破(优先)关系。因此,任务t2(Priority=5, ID=110, Time=10)
可以在任务O(log(n))
之前(即优先于其)。
删除具有最高优先级的此类项目(位于根目录)以及可能具有相同优先级的其他项目,零剩余时间和最低ID仍为O(log n)
操作在保持堆属性的同时在堆或优先级队列中。请注意,优先级队列不适合搜索(哈希表或二进制搜索树这样做);但是在保持堆属性的同时插入或删除。您应该使用peek
和remove
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)
)。