计划任务的javascript程序的时间复杂性
你们的研究机构刚刚收到一台新的超级计算机。它能够同时处理多个不同的任务,但前提是它知道每个任务需要多长时间才能给出结果 这台超级计算机以时间单位测量时间,并以以下方式运行: 所有需要处理的任务都放置在队列中。 位于队列顶部的任务正好获得1个CPU时间单位。如果未完成,则将其放在队列的后面。 队列中的任务重新调度由一个特殊的处理单元管理,因此不需要额外的CPU时间。 您已将任务提交到处理队列,希望了解在结果准备就绪之前需要等待多长时间 假设taskQueue是一个正整数数组,其中taskQueue[i]表示队列中第i个任务为给出结果而剩余的CPU时间的时间单位数,以及一个正整数n作为taskQueue中任务的当前索引(基于0),请查找在任务完成之前需要等待的时间单位数 范例 对于taskQueue=[3,1,2]和n=2,输出应为 多任务(任务队列,n)=5。 如果我们以1个时间单位的步骤遍历队列状态,它将如下所示: [3, 1, 2'] -> [1, 2', 2] -> [2', 2] -> [2, 1'] -> [1', 1] -> [1] 其中您的任务标记为“”。 对于taskQueue=[1,2,3,1,2]和n=0,输出应为 多任务(任务队列,n)=1。 输入/输出 [时限]4000毫秒(js) [input]array.integer任务队列 第i个整数表示队列中第i个任务为给出结果而剩余的CPU时间的时间单位数 保证约束条件: 1.≤ taskQueue.length≤ 105 1.≤ 任务队列[i]≤ 109 [输入]整数n 任务队列中任务的索引(基于0) 保证约束条件: 0≤ n计划任务的javascript程序的时间复杂性,javascript,queue,scheduler,round-robin,Javascript,Queue,Scheduler,Round Robin,你们的研究机构刚刚收到一台新的超级计算机。它能够同时处理多个不同的任务,但前提是它知道每个任务需要多长时间才能给出结果 这台超级计算机以时间单位测量时间,并以以下方式运行: 所有需要处理的任务都放置在队列中。 位于队列顶部的任务正好获得1个CPU时间单位。如果未完成,则将其放在队列的后面。 队列中的任务重新调度由一个特殊的处理单元管理,因此不需要额外的CPU时间。 您已将任务提交到处理队列,希望了解在结果准备就绪之前需要等待多长时间 假设taskQueue是一个正整数数组,其中taskQueue
function multitasking(taskQueue, n) {
let queue = new Queue(taskQueue,n);
while(queue.data.length) {
queue.runTask();
}
return queue.count;
}
这在大多数情况下都很有效。但时间复杂度很高。对于例如
多任务处理([10000000000000000000],1)这在4000毫秒以下无法解决。有人能帮我降低时间复杂度吗?您似乎在运行模拟而不是分析。这是基于使用递增运算符逐个调整
queue.count
。计算剩余时间所需的时间将根据任务完成所需的时间而增加
我对分析剩余时间的最初想法如下(未经测试,未编码):
更新: 第二个想法是仍然“规范化”队列-在
n
时间单位之后,队列会是什么样子,其中n
是任务在队列中的位置(可能为零)
现在问题来了,以循环方式执行队列中其他任务的顺序是否会影响任务完成的计算时间?如果没有,您可以将队列的其余部分按降序排序,同时将任务保留在队列的顶部
如果顺序无关紧要,您可以从数组末尾开始处理排序后的队列条目,并通过维护多个累加器(例如,所花费的总时间和所需的队列迭代次数)计算任务完成所需的时间,而无需操纵队列的数组结构,甚至数组中的条目值
更精细的细节仍需处理,但执行此类分析所需的时间应取决于初始队列的长度,而不是每个任务的剩余时间
function Queue(data,n) {
this.data = [...data];
this.taskIndex = n;
this.count = 0;
this.requeue = function() {
let firstvalue = this.data[0];
if(this.taskIndex) {
this.taskIndex--;
} else if(!firstvalue) {
this.data = [];
return;
} else {
this.taskIndex = this.data.length-1;
}
if(firstvalue) {
this.data.push(firstvalue);
}
this.data.shift();
}
this.runTask = function() {
this.data[0]--;
this.count++;
this.requeue();
}}