最大并发任务数|豆包MarsCode AI刷题
一、定义
理解任务的并发执行是至关重要的。这不仅涉及到资源的有效利用,还关系到任务完成的效率和性能,最大并发任务数(Maximum Concurrent Tasks)是指在给定时间范围内,系统能够同时处理的最大任务数量。
二、计算方法
- 理论计算:基于系统资源的理论最大并发数,比如CPU核心数乘以某个系数。
- 实际测试:通过压力测试和性能测试来确定系统在实际负载下的最大并发数。
- 算法优化:使用算法(如本文将会用到的贪心算法)来优化任务调度,提高并发处理能力。
三、题目:多任务下载器挑战
问题描述
小M的程序设计大作业是编写一个多任务下载器。在实现过程中,他遇到了一个问题:在一次下载过程中,总共有N个任务,每个任务会在第x秒开始,并持续y秒。小M需要知道,在同一时刻,最多有多少个任务正在同时下载,也就是计算出任务的最高并发数。
n表示任务的数量。array是一个二维列表,每个元素为[x, y],表示任务的开始时间和持续时间,其中:x表示任务的开始时间;y表示任务的持续时间。
测试样例
样例1:
输入:
n = 2 ,array = [[1, 2], [2, 3]]
输出:2
样例2:
输入:
n = 4 ,array = [[1, 2], [2, 3], [3, 5], [4, 3]]
输出:3
样例3:
输入:
n = 5 ,array = [[1, 3], [3, 4], [2, 2], [6, 5], [5, 3]]
输出:3
代码
def solution(n, array):
# 创建一个列表,包含所有任务的开始和结束时间
timeline = []
for start, duration in array:
timeline.append((start, 1)) # 开始时间,增加计数
timeline.append((start + duration, -1)) # 结束时间,减少计数
# 按时间点排序
timeline.sort()
max_concurrent = 0 # 最大并发数
current_concurrent = 0 # 当前并发数
# 遍历时间线
for time, change in timeline:
current_concurrent += change # 更新当前并发数
max_concurrent = max(max_concurrent, current_concurrent) # 更新最大并发数
return max_concurrent
代码解析
代码的核心思想是将每个任务的开始和结束时间点记录在时间线上,然后遍历这个时间线来计算最大并发数。
1. 初始化和数据结构
代码首先创建了一个名为timeline的列表,用于存储所有任务的开始和结束时间点。每个任务由一个元组(start, duration)表示,其中start是任务的开始时间,duration是任务的持续时间。
python
for start, duration in array:
timeline.append((start, 1)) # 开始时间,增加计数
timeline.append((start + duration, -1)) # 结束时间,减少计数
这里,1和-1分别表示任务的开始和结束。这种设计允许我们通过简单的加法和减法来跟踪并发任务的数量。
2. 排序
时间线需要按照时间点进行排序,以确保我们按照正确的顺序处理事件。
python
timeline.sort()
这一步是必要的,因为我们需要确保在处理结束时间点之前已经处理了相应的开始时间点。
3. 贪心算法实现
接下来,代码使用两个变量max_concurrent和current_concurrent来跟踪最大并发数和当前并发数。
python
max_concurrent = 0 # 最大并发数
current_concurrent = 0 # 当前并发数
这两个变量在遍历时间线的过程中不断更新。
4. 遍历时间线
代码通过一个循环遍历时间线中的每个事件,并根据事件类型(开始或结束)更新当前并发数。
python
for time, change in timeline:
current_concurrent += change # 更新当前并发数
max_concurrent = max(max_concurrent, current_concurrent) # 更新最大并发数
在每次迭代中,current_concurrent根据事件类型增加或减少。如果当前并发数大于max_concurrent,则更新max_concurrent。
5. 返回结果
最后,函数返回计算出的最大并发数。
python
return max_concurrent