PHP 输出数组的排列组合的算法
2017-05-16 23:06:21
•
阅读
打赏
本文为大家带来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)
/**
* 直接选择
比如说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 输出数组的排列组合的算法就是小编分享给大家的全部内容了,希望能给大家一个参考。
相关推荐
深度学习 -- 损失函数
深度残差网络(Deep Residual Networks (ResNets))
深度学习 -- 激活函数
神经网络训练 -- 调整学习速率
生成对抗网络(GAN)改进与发展
生成对抗网络(GAN)优点与缺点
生成对抗网络(GAN)的训练
生成对抗网络(GAN)基本原理
生成模型与判别模型