我有一堆套装,A1,A2,A3,...... AN。每组包含0到2000之间的N个元素(比如说最多1000个)。 实施例
A1{1,2,3,4}
A2{2,4,3,5}
A3(1,2,5,6)
现在尺寸为k,例如3,A1的组合将是C1(1,2,3),C2(1,2,4),C3(2,3,4)对于A1到AN,我需要弄清楚A1中的所有组合是否也存在在A2到AN的组合中的某个地方。
即。 A1的组合C3将匹配A2中的组合,并且可能是AN。现在我需要A1的C1和C2的结果以及A2到AN的结果。 简单且低效的方法是为所有组A1至AN生成k大小的所有组合。然后对于A的C1,其中/如果它存在于A2到AN中。在那之后C2,然后是C3。然后转到下一组并重复。
我怎样才能改进这种方法,因为一旦添加了新的集合,它需要频繁而昂贵的计算?
我发现的另一个解决方案是在没有优化的情况下在O(N ^ 2 + N)中运行,其中基本上涉及到A1和A2的交点... AN,计算这些交叉点的组合,然后查看每个交叉点的次数这些组合发生在生成的结果中。
答案 0 :(得分:0)
您可以尝试哈希组合。 您可以在这里使用两种方法,一种可以优化空间,另一种可以优化时间。 对于时间优化,您的散列函数将为每个组合创建一个唯一的键,并且当您在已经占用的位置被击中时,您将知道您第一次遇到该组合。 对于空间优化,方法类似,但密钥不是唯一的。您必须管理密钥的相应组合列表,并在点击时遍历它以查看它是否包含您当前正在检查的组合。您的密钥的唯一性等级将定义您的表的大小,从而确定您需要花费的时间来验证匹配。