python - 如何找到最大的共同范围?

标签 python algorithm datetime intervals

我有一个包含数百个这样的元组的列表:

list1 = [(epoch1, epoch2), (epoch3, epoch4), (epoch5, epoch6)]

每个元组都以纪元的形式包含 session 的开始和结束。

我要查找的是同时发生的最大 session 数。所以如果 epoch1 = 16:00, epoch2=16:30, epoch3=16:15, epoch4=16:45, epoch5=18:00, epoch6=19:00, 答案是 2,因为从 16:15 到 16:30 有两个 session 处于事件状态(第一个和第二个)。

我认为一种方法是创建一个包含所有日期的新列表,如下所示:

list2 = [epoch1, epoch2, epoch3, epoch4, epoch5, epoch6]  

然后遍历 list2 中的每一对元素,并检查有多少 list1 元组在其 session 边界中包含它们。但我想这个解决方案非常慢。有没有人有其他想法?

最佳答案

两种 O(n log n) 方式

设置:

sessions = [('16:00', '16:30'), ('16:15', '16:45'), ('18:00', '19:00')]

第一种方式:将开始和结束变成事件(epoch+change 对),按升序遍历它们,并适当更新activemaxactive

events = (event
          for start, end in sessions
          for event in ((start, 1), (end, -1)))
active = maxactive = 0
for _, change in sorted(events):
    active += change
    maxactive = max(maxactive, active)
print(maxactive)

第二种方式:独立排序开始和结束,然后“并行”遍历它们,更新所需槽的数量和当前空闲槽的数量。

starts, ends = map(sorted, zip(*sessions))
slots = free = e = 0
for start in starts:
    while ends[e] <= start:
        free += 1
        e += 1
    if free:
        free -= 1
    else:
        slots += 1
print(slots)

关于python - 如何找到最大的共同范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32130780/

相关文章:

Python:转置数据以创建两个日期之间每个月的记录

algorithm - 关于大 O 符号和复杂性

algorithm - 以等概率创建具有给定入度的所有强连通图

java - 如何将从 bash 脚本获取的日期转换为 Java 程序中的毫秒数?

python - 适用于 Linux 和 Windows 平台的 GUI - Python CRUD 应用程序

python - 将 pyspark 数据框与另一个数据框进行比较

python - 在一组字符串中查找子字符串

performance - 矩阵乘法 - 分而治之 vs Strassen,分而治之更快?

php - 如何在PHP中计算日期时间字段和现在的差异?

c# - 在 Lambda 表达式中使用三元运算符