编程题-任务调度器(中等-最优化算法)

题目:

给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表,用字母 A 到 Z 表示,以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一个限制:两个 相同种类 的任务之间必须有长度为 n 的冷却时间。

返回完成所有任务所需要的 最短时间间隔 。

解法一(模拟):

一种容易想到的方法是,按照时间顺序,依次给每一个时间单元分配任务。如果当前有多种任务不在冷却中,我们应当选择剩余执行次数最多的那个任务,将每种任务的剩余执行次数尽可能平均,使得CPU处于待命状态的时间尽可能少。我们可以用一个二元组kyk(rest, nextValid)记录每个任务的状态,其中rest表示每个任务剩余的执行次数,nextValid表示每个因冷却限制最早可以执行的时间。我们用index记录当前的时间,根据我们的策略,我们需要选择不在冷却中并且剩余执行次数最多的那个任务

我们需要找到满足nextValid≤time的并且rest最大的索引i,然后更新此任务下的(rest, nextValid)状态,记录任务i下一次冷却结束的时间以及剩余执行次数,如果更新后的rest==0,那么任务i全部做完,我们在遍历二元数组时可以忽略它了。而对于time的更新,我们可以选择将其不断增加1,模拟一个时间片。但这样会导致我们在CPU处于待命状态时,对二元数组进行不必要的遍历,为了减少时间复杂度,我们可以在每次遍历之前,将time更新为所有nextValid中的最小值,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值