Maison > Article > développement back-end > 排列组合算法
<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