首页 >后端开发 >php教程 >排列组合算法

排列组合算法

WBOY
WBOY原创
2016-06-06 20:20:421261浏览

<code>$arr = [
    'a'=>[0,1,2,3],
    'b'=>[0,1,2,3,6,7],
    'c'=>[1,2,3,4,7,8,9],
    'd'=>[6,8,1,3,5]
];
//上面组成的新数组:
$new = [
    count($arr[a]) * count($arr[b]),
    count($arr[a]) * count($arr[c]),
    count($arr[a]) * count($arr[d]),
    count($arr[b) * count($arr[c]),
    count($arr[b) * count($arr[d]),
    count($arr[c) * count($arr[d])
];
//最后把new数组里面的值全部相加</code>

现在有一个数组,从arr数组中取出2(这个也可能是3个或者更多)个子数组,两个数组的长度想乘得出的值放入new数组最终把new数组里面的值全部相加,得出结果.目前我的做法是使用循环.有没有什么公式可以直接实现?

回复内容:

<code>$arr = [
    'a'=>[0,1,2,3],
    'b'=>[0,1,2,3,6,7],
    'c'=>[1,2,3,4,7,8,9],
    'd'=>[6,8,1,3,5]
];
//上面组成的新数组:
$new = [
    count($arr[a]) * count($arr[b]),
    count($arr[a]) * count($arr[c]),
    count($arr[a]) * count($arr[d]),
    count($arr[b) * count($arr[c]),
    count($arr[b) * count($arr[d]),
    count($arr[c) * count($arr[d])
];
//最后把new数组里面的值全部相加</code>

现在有一个数组,从arr数组中取出2(这个也可能是3个或者更多)个子数组,两个数组的长度想乘得出的值放入new数组最终把new数组里面的值全部相加,得出结果.目前我的做法是使用循环.有没有什么公式可以直接实现?

没有什么公式可以实现,公式其实就是算法,算法就可能会有循环

<code><?php
$arr = [
    'a'=>[0,1,2,3],
    'b'=>[0,1,2,3,6,7],
    'c'=>[1,2,3,4,7,8,9],
    'd'=>[6,8,1,3,5]
];

$arr_len = array();
foreach($arr as $item) {
    $arr_len[] = count($item);
}
// 以上循环可以统计字数组的长度

$res = 0; // 要输出的结果
$c_arr_len = $arr_len;
foreach($arr_len as $k1=>$v1) {
    unset($c_arr_len[$k1]); // 处理了一个数之后删除
    if(count($c_arr_len)>0) {
        foreach($c_arr_len as $k2=>$v2) {
            $res += ($v1*$v2);
        }
    }
}
var_dump($res);//得到结果,其实不需要产生你那个$new数组</code>


2*(a1*a2 a1*a3 ... a2*a3 ...) === ( a1 a2 a3 ... )**2 - (a1**2 a2**2 ...)
然後你可以用map和reduce來避免寫循環
但是計算複雜度不變的, 還是n^2

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn