首页 > PHP教程 > php开发知识文章

PHP 输出数组的排列组合的算法

本文为大家带来PHP 输出数组的排列组合的算法,欢迎大家的学习。

排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;

从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示。

此外规定0!=1(n!表示n(n-1)(n-2)...1,也就是6!=6x5x4x3x2x1[1] 

组合的定义:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;

从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。

C(n,m)=C(n,n-m)。(n≥m) 

PHP 输出数组的排列组合的算法

/**
* 直接选择
比如说a b c
首先将a之后的字符依次与a进行交换
1 b,a,c
2 c,b,a
注意这里少了一个原始数据 a,b,c。需要把原始数据也算如排列中
3 a,b,c

然后把字符移到第二个位置,将第二个位置之后的数分别与第二个位置的数进行交换
1 b,a,c ===> 11 b,c,a
2 c,b,a ===> 21 c,a,b
3 a,b,c ===> 31 a,c,b

**/
function getPer($arr, $begin)
{
if (!is_array($arr)) return;
$N = count($arr);
if ($begin == $N - 1 || $begin > $N || $begin < 0) return;
if ($begin == 0) {
print_r($arr);//输出原始数据
echo '</br>';
}
//循环将初始值与第i个值交换后进行组合
for ($i = $begin; $i < $N; $i++) {

$t = $arr[$begin];
$arr[$begin] = $arr[$i];
$arr[$i] = $t;

if ($i !== $begin) {//i==begin时的数已经输出过
print_r($arr);
echo '</br>';
}
getPer($arr, $begin + 1);
$t = $arr[$begin];
$arr[$begin] = $arr[$i];
$arr[$i] = $t;

}
}

$arr = array('php', 'java', 'c');
getPer($arr,0);

 

/**
* 直接插入
初始时从0个元素开始,输出初始序列,为组合的一个序列
当在来一个元素时只需将该元素放在该元素之前的元素组的不同的位置即组成了不同的排列
如已有元素组为a,b.新元素为c,c分别与a,b进行交换即可(a,c,b);(c,b,a),在现有的排列上在新增元素
重复执行以上步骤
*/
function getPer1($arr, $begin)
{
if ($begin == 0) {
print_r($arr);
echo "</br>";
//zuhe2($arr,$begin+1);
}
if ($begin >= count($arr)) return;
getPer1($arr, $begin + 1);//begin时的排列上一次已产生,直接新增元素
for ($i = $begin - 1; $i >= 0; $i--) {
$t = $arr[$begin];
$arr[$begin] = $arr[$i];
$arr[$i] = $t;
print_r($arr);
echo "</br>";
getPer1($arr, $begin + 1);
$t = $arr[$begin];
$arr[$begin] = $arr[$i];
$arr[$i] = $t;
}
}

以上这篇PHP 输出数组的排列组合的算法就是小编分享给大家的全部内容了,希望能给大家一个参考。

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。