Я пытаюсь создать соответствующий сервис, как показано ниже. По сути, он находит все наиболее подходящие массивы в foods
. Я пытался использовать приведенный ниже код, но он был слишком медленным на> = 50 миллионов строк. Я хочу получить результат за 60 секунд, но я не мог придумать лучшего алгоритма. Ниже мой код, который я использовал для 11 записей.
import numpy as np
result = set()
foods = [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[2, 9, 5, 3, 10],
[1, 2, 5, 10, 2],
[2, 10, 9, 3, 6],
[10, 3, 4, 6, 7],
[6, 2, 4, 3, 5],
[3, 10, 9, 8, 7],
[2, 9, 5, 3, 1],
[8, 6, 3, 2, 5],
[1, 7, 8, 9, 10],
]
foods = [np.array(sorted([f for f in food])) for food in foods]
best_simularity = -1
for base_idx, base_food in enumerate(foods):
for target_idx, target_food in enumerate(foods[base_idx+1:]):
sim = len(np.intersect1d(base_food, target_food))
if sim < best_simularity:
continue
if sim > best_simularity:
result = set()
result.add(f'{base_idx+1}-{base_idx+1+target_idx+1}')
best_simularity = sim
# Expecting
# 4 1-9, 2-8, 3-9, 7-10, 1-7, 2-11, 3-5, 8-11
print(f"{best_simularity}", ", ".join(list(result)))