计划任务的javascript程序的时间复杂性

计划任务的javascript程序的时间复杂性,javascript,queue,scheduler,round-robin,Javascript,Queue,Scheduler,Round Robin,你们的研究机构刚刚收到一台新的超级计算机。它能够同时处理多个不同的任务,但前提是它知道每个任务需要多长时间才能给出结果 这台超级计算机以时间单位测量时间,并以以下方式运行: 所有需要处理的任务都放置在队列中。 位于队列顶部的任务正好获得1个CPU时间单位。如果未完成,则将其放在队列的后面。 队列中的任务重新调度由一个特殊的处理单元管理,因此不需要额外的CPU时间。 您已将任务提交到处理队列,希望了解在结果准备就绪之前需要等待多长时间 假设taskQueue是一个正整数数组,其中taskQueue

你们的研究机构刚刚收到一台新的超级计算机。它能够同时处理多个不同的任务,但前提是它知道每个任务需要多长时间才能给出结果

这台超级计算机以时间单位测量时间,并以以下方式运行:

所有需要处理的任务都放置在队列中。 位于队列顶部的任务正好获得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 [输出]整数64

任务完成前需要等待的时间单位数

这是我写的代码:

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)个时间单位,因此将总时间设置为(n)。不要将剩余时间为1的任务之前的任务添加到规范化队列的末尾

  • 在以下任务中查找少于任务所需时间的最少所需时间计数

  • 如果在步骤2中找到了任务,请将其时间乘以任务队列长度,再加上总时间,然后从队列中的所有时间中减去任务时间。从队列中删除找到的任务

  • 如果在任何时候,您的任务剩余时间为一个,请将一个添加到总数中并返回

  • 如果在步骤2中找到任务,请从步骤2中重复

  • 将完成任务的剩余时间添加到总时间中,并返回结果


  • 更新:

    第二个想法是仍然“规范化”队列-在
    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();
    }}