是否有一个有效的算法来检查多个有界连续范围之间的重叠?
如果我们有一对任务,每个任务由开始时间和结束时间表示,则下面的函数可以检测冲突。
# tasks are of the form (start_time, end_time)
def has_clash(task_1: tuple[float, float], task_2: tuple[float, float]) -> bool:
"""Check if a clash exists between two tasks."""
return (task_2[1] > task_1[0]) and (task_2[0] < task_1[1])
字符串
要检查多个任务,我们必须在任务集上成对运行上述测试,总复杂度为O(n^2),例如:
def has_any_clash(tasks: list[tuple[float, float]]) -> bool:
"""Check if any tasks clash, return True if no clashes, false otherwise."""
if len(tasks) < 2:
return False
clash = any(
has_clash(task, other_task)
for i, (task) in enumerate(tasks[1:])
for other_task in tasks[:i]
)
return clash
型
这种复杂性是否可以通过例如排序或者其他数学魔法
有没有一种算法可以更有效地做到这一点?
1条答案
按热度按时间q35jwt9p1#
按开始时间对列表进行排序,然后将连续条目的最后一个结束时间与下一个开始时间进行比较。这样做的复杂度是O(nlogn)排序和O(n)迭代对。
字符串
如果你想要一个列表 * 哪些 * 任务冲突(这些可能比连续的任务更多),这会涉及更多,但不会太多。除上述内容外:
heap
跟踪“正在运行”的任务,按结束时间排序