В моей маленькой задаче у меня n пользователей и m оборудований (m и n ~ 50000). Один пользователь может использовать одно и только одно оборудование одновременно.
У меня есть список записей в этом формате [ u, e, t ], с t (время), отсортированными по возрастанию. Каждая запись означает, что пользователь u использует оборудование e во время t . Количество записей составляет около 500 миллионов. Предположим, что две ближайшие записи с одинаковыми u и e означают, что u постоянно использует e . Например:
1, 2, 1
3, 4, 1
1, 2, 3
1, 2, 4
1, 2, 5
2, 6, 6
3, 2, 6
3, 2, 8
будет означать, что пользователь 1 использует оборудование 2 от 1 до 5.
Что я хочу сделать, это из этого списка, вывести время смены в следующем формате: [ u, e, st, et ], что означает, что пользователь u использует оборудование e от времени начала st до времени окончания et .
Результат для данных выборки будет:
1, 2, 0, 5
3, 4, 0, 6
3, 2, 6, 8
(при условии, что время начинается с 0 и заканчивается в max (t), и когда пара (u, e) впервые видна, u уже начал использовать e с начала времени 0. Аналогично для последних записей. )
Учитывая большой список (500 миллионов записей), но достаточно маленький m и n, как я могу сделать это наиболее эффективно?
@ Редактировать: Возможные несоответствия данных:
1: Если в данных выборки есть только 1 запись (поэтому нет времени окончания), например, случай [2, 6, 6]:
--- Если это единственный раз, когда пользователь 2 и оборудование 6 появляются в наборе данных, игнорируйте точку данных.
--- Если после этой записи пользователь 2 использует другое оборудование, скажем, 7 на 10, то 2 использует 6 от 6 до 10.
--- Если после этой записи оборудование 6 используется другим пользователем, скажем, 10 в 11, то 2 использует 6 от 6 до 11.