我正在尝试用 PHP 编写一个函数来获取所有可能大小的所有排列。我认为一个例子是最好的开始方式:
$my_array = array(1,1,2,3);
不同大小的可能排列:
1 1 // * 见注 2 3 1,1 1,2 1,3 // 以此类推,对于所有大小为 2 的集合 1,1,2 1,1,3 1,2,1 // 以此类推,对于所有大小为 3 的集合 1,1,2,3 1,1,3,2 // 以此类推,对于所有大小为 4 的集合
注意:我不在乎是否有重复。出于本示例的目的,已省略所有未来的重复项。
到目前为止我在 PHP 中所拥有的:
function getPermutations($my_array){
$permutation_length = 1;
$keep_going = true;
while($keep_going){
while($there_are_still_permutations_with_this_length){
// Generate the next permutation and return it into an array
// Of course, the actual important part of the code is what I'm having trouble with.
}
$permutation_length++;
if($permutation_length>count($my_array)){
$keep_going = false;
}
else{
$keep_going = true;
}
}
return $return_array;
}
我能想到的最接近的事情是改组数组,挑选前 n 个元素,查看它是否已经在结果数组中,如果不是,将其添加,然后在数学上没有更多可能的排列时停止该长度. 但它丑陋且资源效率低下。
任何伪代码算法将不胜感激。
此外,对于超级骗子(毫无价值)的奖励积分,有没有办法只用函数获得 1 个排列,但让它不必重新计算所有先前的排列来获得下一个排列?
例如,我给它传递了一个参数 3,这意味着它已经完成了 3 次排列,它只是生成数字 4,而不重做前面的 3?(传递参数不是必需的,它可以在全局或静态中跟踪)。
我问这个的原因是因为随着数组的增长,可能的组合数量也在增长。可以这么说,一个只有十几个元素的小数据集迅速增长为数万亿种可能的组合,我不想让 PHP 一次在其内存中保存数万亿个排列。