📅  最后修改于: 2023-12-03 14:58:24.563000             🧑  作者: Mango
门| GATE-CS-2001 |第 46 题
假设某个计算机片上有 a 个 CPU,b 个磁盘和 c 个终端。该计算机可以处理n个独立的作业。假设在单个 CPU 上处理每个作业时需要的时间为 t。然后,假设将数据从磁盘传输到内存的时间为 d、将数据从内存传输到终端的时间为 e,将控制传输从 CPU 到终端的时间为 f,将控制传输从终端到 CPU 的时间为 g。设计一个任务分配策略,该策略应将任务分配给给定计算机上的 CPU、磁盘和终端,以最小化完成所有作业所需的总时间。
输入:a=2, b=3, c=2, n=6, t=1, d=3, e=2, f=1, g=2
输出:总时间 = 33
该问题与作业调度问题类似。因为在任务分配中,我们需要将作业分配给可用的 CPU、磁盘和终端,以便最小化完成所有作业所需的总时间。我们可以使用贪心算法来解决这个问题。
首先,我们需要将所有的作业按照它们的处理时间进行排序。
接着,我们需要为每个作业分配一个可用的 CPU。我们可以选择第一个可用的 CPU。如果所有的 CPU 都已经在处理作业了,我们需要等待当前活跃的作业完成,然后再分配下一个作业。
一旦作业被分配到 CPU 上,我们需要选择一个可用的磁盘将数据从磁盘传输到内存。同样地,如果所有的磁盘都在忙碌,我们需要等待,直到一个磁盘可用为止。
然后,我们需要将数据从内存传输到终端,同时等待一个可用的终端。如果所有的终端都在忙碌,我们需要等待,直到一个终端可用为止。
一旦数据被传输到终端,我们需要等待,直到终端完成任务,并将控制传输回 CPU。
最后,我们可以将下一个作业分配给 CPU,并重复以上操作。
下面是相应的Python代码片段。
def min_total_time(a, b, c, n, t, d, e, f, g):
jobs = [(i+1)*t for i in range(n)] # 处理作业所需时间
cpu = [0] * a # CPU 列表,长度为a
disk = [0] * b # 磁盘列表,长度为b
term = [0] * c # 终端列表,长度为c
total_time = 0
for job_time in jobs:
# 选择第一个可用的CPU
min_cpu_time = min(cpu)
min_cpu_index = cpu.index(min_cpu_time)
# 选择第一个可用的磁盘
min_disk_time = min(disk)
min_disk_index = disk.index(min_disk_time)
# 选择第一个可用的终端
min_term_time = min(term)
min_term_index = term.index(min_term_time)
# 计算总时间
total_time += max(min_cpu_time - min(disk[min_disk_index], term[min_term_index]), 0)
total_time += d + e + f + g # 磁盘到内存的时延+内存到终端的时延+控制传输时延
# 更新 CPU,磁盘和终端的状态
cpu[min_cpu_index] += job_time
disk[min_disk_index] = max(disk[min_disk_index], min_cpu_time) + d # 将数据从磁盘传输到内存
term[min_term_index] = max(term[min_term_index], disk[min_disk_index], min_cpu_time) + e + f + g # 将数据从内存传输到终端后,将数据传输回CPU
return total_time
在上述代码中,我们使用了3个列表来记录处理作业的 CPU,磁盘和终端的状态,同时使用 jobs 列表存储所有作业的处理时间。我们计算总时间时,遵循上述6个步骤。最后返回总时间。时间复杂度为 O(n)
。
在该程序中,我们使用贪心算法来解决了任务分配问题。我们首先按照每个作业的处理时间进行排序,然后为每个作业分配一个可用的 CPU,选择一个可用的磁盘将数据从磁盘传输到内存,将数据从内存传输到终端,等待终端完成任务并将控制传输回 CPU。重复此操作,直到所有作业都处理完毕。时间复杂度为 O(n)
。