PHP配列組合せアルゴリズム

18588 ワード

配列:M個の数字の中からN個の数字を選択して、数字は繰り返して組み合わせることができます:M個の数字の中からN個の数字を選択して、数字は繰り返してはいけません

 //   
function factorial($n)
 {
	return array_product(range(1, $n));
}
 
//       
function A($n, $m) 
{
	return factorial($n)/factorial($n-$m);
}
 
//       
function C($n, $m) 
{
	return A($n, $m)/factorial($m);
}
 
//   
function arrangement($a, $m)
 {
	$r = array();
 	$n = count($a);
	if ($m <= 0 || $m > $n)
	 {
		return $r;
	}
 	for ($i=0; $i<$n; $i++)
 	 {
		$b = $a;
		$t = array_splice($b, $i, 1);
		if ($m == 1)
		 {
			$r[] = $t;
		}
		 else
		  {
			$c = arrangement($b, $m-1);
			foreach ($c as $v) {
				$r[] = array_merge($t, $v);
			}
		}
	}
	return $r;
}
 
//   
function combination($a, $m)
 {
	$r = array();
 	$n = count($a);
	if ($m <= 0 || $m > $n)
	 {
		return $r;
	}
 	for ($i=0; $i<$n; $i++) 
 	{
		$t = array($a[$i]);
		if ($m == 1)
		 {
			$r[] = $t;
		}
		 else
		  {
			$b = array_slice($a, $i+1);
			$c = combination($b, $m-1);
			foreach ($c as $v) {
				$r[] = array_merge($t, $v);
			}
		}
	}
 	return $r;
}

// ======    ======
$arr = array(1,2,3,4,5);//    
$arr_len=count($arr);
$maxlength=3;	//    

$r = A($arr_len, $maxlength);
echo "   P({$arr_len}, {$maxlength})={$r}
"
; $r = arrangement($arr, $maxlength); foreach($r as $v) { echo join('',$v).' '; } echo '
'
; $r = C($arr_len, $maxlength); echo " C({$arr_len}, {$maxlength})={$r}
"
; $r = combination($arr, $maxlength); foreach($r as $v) { echo join('',$v).' '; }
   P(5, 3)=60
123 124 125 132 134 135 142 143 145 152 153 154 213 214 215 231 234 235 241 243 245 251 253 254 312 314 315 321 324 325 341 342 345 351 352 354 412 413 415 421 423 425 431 432 435 451 452 453 512 513 514 521 523 524 531 532 534 541 542 543
   C(5, 3)=10
123 124 125 134 135 145 234 235 245 345

原文転入先:https://blog.csdn.net/song5198038_1/article/details/50188739 略して修正する.