これがアルゴリズムの粒です。それは確かに洗い流されたりテストされたりしておらず、完全ではないかもしれません。可能性のある出発点として、ここでそれを捨てています。
最も困難な問題は、数十億行にわたってアルゴリズムを実行するのに必要な時間であり、おそらくメモリの制限が続きます。
また、この問題を解決するための基本的なタスクは、「ある数値セットを別の数値セットと比較する」という単一の操作にあり、共有セットを見つけることができると考えています。
したがって、時間とメモリの両方に取り組むために、次の(大まかな)アプローチをお勧めします。
(1) Consolidate multiple sets into a single, larger set.
つまり、100 個の連続したセット (この例で23, 67, 34, 23, 54
は 、23, 54
、 、および次の 97 個のセット) を取り、単純にそれらを 1つ78, 96, 23
のセットにマージします(重複を無視します)。
(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.
今、アルゴリズムは新しい段階に移行します。
(4) Develop an algorithm to look for matching sequences between any two of these larger sets.
多くの誤検知があります。ただし、うまくいけば、データの性質上、このアプローチによって得られる効率が偽陽性によって「損なわれる」ことはありません。
ここでは、2 つの個別のセット間のマッチングを実行するアルゴリズムは提供しません。自分で思いつくことができると思います(両方のセットを並べ替えるなど)。
(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.
上記のステップは大幅に最適化できると思いますが、これが基本的な考え方です。
この時点で、比較対象の 2 つの大きなセットを構成するすべての元のセット間で一致するすべてのシーケンスが得られます。
(6) Execute steps (4) and (5) for every pair of large sets constructed in (2).
これで、すべての一致するシーケンスが得られます - 重複があります。
(7) Remove duplicates from the set of matching sequences.
ちょっとした考え。