我的脚本以$givenNumbers
数组为中心,并带有1-1000的随机数:
$givenNumbers = [383, 886, 777, 84, 327, 336, 505, 846, 729, 313, 857, 124, 895, 582, 545, 814, 367, 434, 364, 43, 750, 87, 808, 276, 178, 788, 584, 403, 651, 754, 399, 932, 60, 676, 368, 739, 12, 226, 586, 94, 539, 654, 999, 5, 24];
对数组进行排序,并删除所有元素重复:
$givenNumbers = array_unique($givenNumbers);
sort($givenNumbers);
然后我声明变量$amount
,它是$givenNumbers
中元素的数量;
$amount = count($givenNumbers);
我现在通过使用循环将数组的所有可能切片存储在数组$slices
中:
$slices = [];
for ($i = 0; $i < $amount; $i++) {
for($j = 0; $j < $amount; $j++) {
array_push($slices, array_slice($givenNumbers, $i, $j));
}
}
已将所有切片存储在$slices
中,我想找到十个切片的所有可能组合,如果将它们合并在一起,将包含$givenNumbers
的所有元素,而没有任何元素出现两次或多次。
我试图通过遍历slices
的键来做到这一点:
$combinations[]
for($i = 0; $i < $amount; $i++) {
for($j = $i+1; $j < $amount; $j++) {
for($k = $j+1; $k < $amount; $k++) {
for($l = $k+1; $l < $amount; $l++) {
for($m = $l+1; $m < $amount; $m++) {
for($n = $m+1; $n < $amount; $n++) {
for($o = $n+1; $o < $amount; $o++) {
for($p = $o+1; $p < $amount; $p++) {
for($q = $p+1; $q < $amount; $q++) {
for($r = $q+1; $r < $amount; $r++) {
$combStorer = [];
$placeholder = array_merge($slices[$i], $slices[$j], $slices[$k], $slices[$l], $slices[$m], $slices[$n], $slices[$o], $slices[$p], $slices[$q], $slices[$r]);
$placeholder = array_unique($placeholder);
if (count($placeholder) == $amount) {
array_push($placeholder, $slices[$i], $slices[$j], $slices[$k], $slices[$l], $slices[$m], $slices[$n], $slices[$o], $slices[$p], $slices[$q], $slices[$r]);
foreach ($placeholder as $comb) {
$combStorer[] = $comb;
}
$combinations[] = $combStorer;
}
}
}
}
}
}
}
}
}
}
}
这基本上应该在slices
中找到满足我要求的十个数组的所有组合,并将它们以多维数组的形式存储在$combinations
中。
但是,当我打开实时预览时,出现致命错误,因为超过了30秒的最大执行时间。
几个用户引起了我的注意,这种方法太复杂了,肯定有更好的解决方案。
有人可以提出更有效的解决方案吗?
答案 0 :(得分:1)
它不是无限的,它只是非常 非常大量迭代,基本上是:
(amount ^ 10) / 2
例如,amount
的值迅速增加:
$ time php index.php 5
real 0m0.067s
user 0m0.043s
sys 0m0.023s
$ time php index.php 10
real 0m0.061s
user 0m0.046s
sys 0m0.014s
$ time php index.php 15
real 0m0.117s
user 0m0.096s
sys 0m0.012s
$ time php index.php 20
real 0m0.546s
user 0m0.506s
sys 0m0.030s
$ time php index.php 25
real 0m3.245s
user 0m3.204s
sys 0m0.032s
$ time php index.php 30
real 0m24.624s
user 0m24.129s
sys 0m0.032s
$ time php index.php 35
real 1m55.215s
user 1m54.532s
sys 0m0.029s