多人员跨时段班次分钟统计的时间复杂度优化问询
班次时段累计分钟数优化方案
核心思路:直接计算时间交集
放弃半小时切片循环的方式,针对每个人员的班次时间,直接与早/中/晚班的固定区间计算交集时长,累加对应时段的总分钟数。时间复杂度从O(n*m)(n为人员数,m为切片数量)降至O(n),效率显著提升。
具体实现步骤
- 先把所有时间统一转换为当天的分钟数(方便数值计算),定义三个时段的范围:
- 早班:
6*60=360到12*60=720分钟 - 中班:
12*60=720到19*60=1140分钟 - 晚班:
19*60=1140到26*60=1560分钟(次日2点等价于当天26小时)
- 早班:
- 对每个人员的班次,同样将开始、结束时间转成分钟数;若班次跨天(比如结束时间是次日1点),则结束时间需加上1440(24小时的分钟数),确保数值逻辑统一
- 计算班次与各时段的交集:
交集起始 = max(班次开始时间, 时段开始时间)
交集结束 = min(班次结束时间, 时段结束时间)
若交集起始 < 交集结束,时长即为(结束-起始)分钟,否则该时段无贡献 - 将每个班次在对应时段的时长累加到总统计值中
示例代码(Python)
# 定义各时段的分钟数区间 time_periods = { "早班": (360, 720), "中班": (720, 1140), "晚班": (1140, 1560) } # 示例人员班次数据:(姓名, 开始分钟数, 结束分钟数) # 例:10:00-15:00 = 600-900;20:00-次日3:00 = 1200-1620(24*60+3*60=1620) staff_shifts = [ ("张三", 600, 900), ("李四", 1200, 1620), # 其余8人数据... ] # 初始化累计统计字典 total_minutes = {period: 0 for period in time_periods} for _, shift_start, shift_end in staff_shifts: # 处理跨天班次(结束时间早于开始时间的情况) if shift_end < shift_start: shift_end += 1440 # 遍历每个时段计算交集时长 for period, (p_start, p_end) in time_periods.items(): overlap_start = max(shift_start, p_start) overlap_end = min(shift_end, p_end) if overlap_start < overlap_end: total_minutes[period] += overlap_end - overlap_start print(total_minutes) # 输出示例:{'早班': 120, '中班': 180, '晚班': 300}
注意事项
- 跨天班次的处理是关键,必须将结束时间转换为超过1440的分钟数,才能和晚班的区间正确计算交集
- 若你的数据是字符串格式的时间(如"10:00"),需要先写个简单的转换函数,把时间字符串转成当天的分钟数
内容的提问来源于stack exchange,提问作者Aditya Sharma
相关产品推荐
相关产品推荐

