Я пытался решить эту проблему эффективным способом. Проблема:
Постановка задачи
Приведен список кортежей в форме [(start1, end1), (start2, end2), (start3, end3)....(startn, endn)]
, где start и end - положительные целые числа. Каждый кортеж должен представлять временное окно, например: [(1, 3), (73, 80)...]
. Найдите время (целое число), в котором происходит максимальный параллелизм, и получите кортежи, где происходит максимальный параллелизм.
Ограничения:
start
и end
являются целыми числами времени и находятся между От 0 до n - Для всех случаев
start
<<code>end start
включительно, но end
исключительно - Для времени (целого), где максимум происходит параллелизм, мы можем получить только один, если есть несколько случаев
Например, приведенное ниже расписание будет иметь max_concurrency во время 2, а кортежи будут (0,3), (2,3), ( 1, 200), которые имеют его.
schedule = [
(0, 3),
(3, 5),
(2, 3),
(6, 8),
(10, 12),
(73, 92),
(1, 200),
]
Мой код
На время, когда происходит максимальный параллелизм. Поправьте меня, если я ошибаюсь, но я думаю, что это работает в O(n^2)
раз.
from collections import defaultdict
schedule_dict = defaultdict(lambda: 0)
for start, end in schedule:
for time in range(start, end):
schedule_dict[time] += 1
max_concurrency = max(schedule_dict, key=schedule_dict.get)
print(f"Time where max concurrency happens is : {max_concurrency}")
Выход
Time where max concurrency happens is : 2
Для сеансы, где достигается максимальный параллелизм, Я думаю, что это выполняется в O(n)
время .
Мой код
for start, end in schedule:
if start <= max_concurrency < end:
print(f"{(start, end)}")
Вывод
(0, 3)
(2, 3)
(1, 200)
Наконец-то мой вопрос
Какой более эффективный способ сделать это, чтобы уменьшить сложность времени и пространства?