У меня есть набор данных, который регистрирует каждую смену, в которой работал сотрудник. Для каждого сотрудника я бы хотел найти сотрудника, с которым он работал больше всего.
Таблица содержит ~ 250 миллионов строк, 50 миллионов смен и 100 тысяч уникальных сотрудников. В качестве примера таблица начинается с:
+----------+--------+
| Shift ID | Emp ID |
+----------+--------+
| 1 | A |
| 1 | B |
| 2 | A |
| 2 | C |
| 3 | A |
| 3 | C |
+----------+--------+
Сотрудник A работал с Сотрудником B один раз, но с сотрудником C дважды. Поэтому самым частым сотрудником сотрудника А является сотрудник C.
Какой алгоритм может найти наиболее часто встречающийся сотрудник каждого сотрудника? Наивно пытаться найти число попарно общих сдвигов было слишком медленно:
solution = {}
for e in employees:
maxCommonShifts = 0
for c in employees:
if e != c:
commonTrips = len(e.trips ∩ c.trips)
if commonTrips > maxCommonShifts:
maxCommonShifts = commonTrips
solution[e] = c
Я полагаю, что решением здесь будет граф al go. В частности, эта проблема кажется аналогичной FB, пытающейся вычислить ближайшего друга человека в том смысле, что у него есть самые общие друзья. С точки зрения графика, будет один узел для каждой смены и один узел для каждого сотрудника. Каждый узел сотрудника связан с каждым рабочим узлом смены.