下面是一个算法的粮食。它当然不会被刷新或测试,并且可能不完整。我只是把它放在这里作为一个可能的出发点。
看来最具挑战性的问题是运行算法在数十亿行所需的时间,通过内存限制可能紧随其后。
我也相信参与解决这一问题的根本任务,以“比较一组号码与另一个”单操作可定位一组共享。
因此,我可能会建议以下(粗糙)的办法,以应对既时间,和内存:
(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.
现在,算法移动到一个新的阶段。
(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.
我怀疑上述步骤可以显着优化,但这是基本思路。
此时,您将拥有构成两个较大集合的所有原始集合之间的所有匹配序列进行比较。
(6) Execute steps (4) and (5) for every pair of large sets constructed in (2).
现在,您将拥有所有匹配的序列 - 带有重复项。
(7) Remove duplicates from the set of matching sequences.
只是一个想法。
我认为通常解决这个问题*(即对序列大小,行数,可用内存或执行分析所需的时间没有限制)可能没有用处。问题可能没有*通用*解决方案,效率高(我不确定)。这可能是一个例子,它可以为你提供更广泛的内容来解决问题*的最相关的子集,从而牺牲理想的解决方案,但是总能让人满意。 –
顺序关联分析 –