Вот зерно алгоритма. Это, конечно, не вымывается или не тестируется, и это может быть не полным. Я просто выбрасываю его здесь как отправную точку.
кажется наиболее сложная проблемой является время требуется для запуска алгоритма над миллиардами строк, а затем, возможно, с помощью памяти ограничения.
Я также считаю, что основная задача, связанная с решением этой проблемы, заключается в единственной операции «сравнения одного набора чисел с другим», чтобы найти общий набор.
Таким образом, я мог бы предложить следующее (грубый) подход, для того, чтобы решать как время, и памяти:
(1) Consolidate multiple sets into a single, larger set.
т.е. принять 100 последовательных наборов (в вашем примере, 23, 67, 34, 23, 54
, 23, 54
, 78, 96, 23
и следующие 97 комплектов) и просто объединить их в набор (игнорируя дубликаты).
(2) Give each *consolidated* set from (1) a label (or index),
and then map this set (by its label) to the original sets that compose it.
Таким образом, вы будете иметь возможность получить (посмотреть) оригинал индивидуальные наборы 23, 67, 34, 23, 54
и т.д.
(3) The data is now denormalized - there are a much smaller number of sets, and each set is much larger.
Теперь, алгоритм переходит на новый этап.
Будет много ложных срабатываний; однако, мы надеемся, характер ваших данных заключается в том, что ложные срабатывания не будут «разрушать» эффективность, получаемую этим подходом.
Я не предоставляю алгоритм для выполнения сопоставления между двумя отдельными наборами здесь; Я предполагаю, что вы можете придумать один (сортировать как наборы, так и т. Д.).
(5) For every possible matching sequence found in (4), iterate through the individual sets that compose
the two larger sets being compared, weeding out false positives.
Я подозреваю, что вышеуказанный шаг может быть значительно оптимизирован, но это основная идея.
На этом этапе вы будете иметь все соответствующие последовательности между всеми оригинальными наборами, которые составляют два сравниваемых больших набора.
(6) Execute steps (4) and (5) for every pair of large sets constructed in (2).
Теперь у вас будет ВСЕ подходящие последовательности - с дубликатами.
(7) Remove duplicates from the set of matching sequences.
Просто мысль.
Я думаю, что решить эту проблему * вообще * (т. Е. Никаких ограничений на размер последовательностей, количество строк, доступную память или время, необходимое для выполнения анализа), может оказаться нецелесообразным. Возможно, проблема не имеет эффективного * решения * (я не уверен). Это может быть случай, когда вам было бы полезно предоставить более широкий контекст того, что вы пытаетесь выполнить, чтобы можно было решить наиболее подходящее подмножество проблемы *, жертвуя идеальным решением, но делая что-то удовлетворительное в любом случае , –
Анализ последовательной ассоциации –