Heim >Backend-Entwicklung >PHP-Tutorial >排列组合算法

排列组合算法

WBOY
WBOYOriginal
2016-06-06 20:20:421261Durchsuche

<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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn