You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多人员跨时段班次分钟统计的时间复杂度优化问询

班次时段累计分钟数优化方案

核心思路:直接计算时间交集

放弃半小时切片循环的方式,针对每个人员的班次时间,直接与早/中/晚班的固定区间计算交集时长,累加对应时段的总分钟数。时间复杂度从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:05:25