我有以下数组,其中包含值数组:
$array = array(
array('1', '2'),
array('a', 'b', 'c'),
array('x', 'y'),
);
可以有任意数量的数组,并且一个数组可以包含任意数量的值。我目前有一段代码将生成所有组合,其中从每个数组中获取一个值。例如:
1ax, 1ay, 1bx, 1by, 1cx, 1cy, 2ax, 2ay, 2bx, 2by, 2cx, 2cy
但是,我真正想要的只是每列中只有一个值的组合,即。1ax 不好,因为所有三个值 1、a 和 x 都位于第一列,1by 不好,因为 b 和 y 位于第二列。所以从上面的例子中只有这些组合是有效的:
1cy, 2cx
我最初计划只生成所有组合,然后过滤掉有冲突的组合,但这并不能扩展,因为这是一个过于简单的例子,在实际应用中,可能会有数百万个组合(包括冲突的组合) )。
任何人都可以提供更好的方法来解决这个问题吗?我正在使用 PHP,但是任何清楚地展示逻辑的代码示例都会有所帮助。
提前致谢。
更新:
我已经测试了针对更大数据集的解决方案,以获得一些基准,这些是迄今为止的结果:
$array = array(
array('1', '2', '3', '1', '2', '3', '1', '2', '3', '1', '2', '3', '1', '2', '3'),
array('a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'),
array('x', 'y', 'z', 'x', 'y', 'z', 'x', 'y', 'z'),
array('1', '2', '3', '1', '2', '3', '1', '2', '3'),
array('a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'),
array('x', 'y', 'z'),
);
乔什戴维斯第二个解决方案:
Combinations: 249480
Time: 0.3180251121521 secs
Memory Usage: 22.012168884277 mb
Peak Memory Usage: 22.03059387207 mb
乔什戴维斯:
Combinations: 249480
Time: 1.1172790527344 secs
Memory Usage: 22.004837036133 mb
Peak Memory Usage: 22.017387390137 mb
汤姆·黑格:
Combinations: 249480
Time: 5.7098741531372 secs
Memory Usage: 39.145843505859 mb
Peak Memory Usage: 39.145843505859 mb