我有以下数组,其中包含值数组:
$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,但是任何清晰演示逻辑的代码示例都会有所帮助。
提前致谢。
Update:
我已经测试了适用于更大数据集的解决方案,以获得一些基准,这些是迄今为止的结果:
$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