Я ищу эффективный способ решения следующей проблемы.
Список 1 представляет собой список записей, которые идентифицируются примитивной триплетом:
X | Y | Z
Список 2 - это список записей, которые идентифицируются тремя наборами. Один X, один Ys, один Zs. X, Y, Z имеют тот же тип, что и в первом списке, поэтому они напрямую сопоставимы друг с другом.
Set(X) | Set(Y) | Set(Z)
Для элемента в списке 1 мне нужно найти все элементы в списке 2, где все X, Y, Z из списка 1 встречаются в соответствующих наборах в списке 2. Это лучше всего демонстрируется на примере:
Список 1:
X1, Y1, Z1
Список 2:
(X1, X2) | (Y1) | (Z1, Z3)
(X1) | (Y1, Y2) | (Z1, Z2, Z3)
(X3) | (Y1, Y3) | (Z2, Z3)
Как указано выше, элемент в списке 1 будет соответствовать первым двум элементам в списке 2. Третий элемент не будет сопоставлен, поскольку X1 не встречается в наборе X, а Z1 не встречается в наборе Z.
Я написал функционально правильную версию алгоритма, но обеспокоен производительностью больших наборов данных. Оба списка очень большие, поэтому итерация по списку 1 и последующая итерация по списку 2 для каждого элемента будет очень неэффективной.
Я попытался построить индекс, отменив нормализацию каждого элемента в списке 2 на карте, но количество записей индекса в индексе на элемент пропорционально размеру подмножеств элемента. Как таковой, он использует очень высокий уровень памяти, а также требует значительных ресурсов для сборки.
Может кто-нибудь предложить мне оптимальный способ решения этой проблемы. Я рад рассмотреть оптимальные решения как для памяти, так и для процессора, но было бы неплохо найти баланс!