2

説明する方法がわからない。しかし、おそらく以下の例は、私の問題が何であるかを理解できるようにするでしょう.

例 :

私は3つの要素を持つ配列を持っています。

$elements = array( 'A', 'B', 'C' );

順列は 3 対 3 になるため、結果は次のようになります。

A-B-C ; A-C-B ; B-A-C ; B-C-A ; C-A-B; C-B-A

例でわかるように、2 in 3 または 1 in 3 の順列は必要ありません。3 in 3 だけです。したがって、配列に 4 つの要素がある場合、順列は 4 対 4 になります。

(順列の数は 3! = 1*2*3 = 6 個の順列、4! = 1*2*3*4 = 24 個の順列だと思います...なぜ私は階乗の順列と呼んでいます。)

私の問題に似た他の質問と回答がある場合は、お知らせください

4

2 に答える 2

5

再帰関数を使用します。

function permutations($elements) {
    if(count($elements)<2) return $elements;

    $newperms= array();
    foreach($elements as $key=>$element) {
        $newelements= $elements;
        unset($newelements[$key]);

        $perms= permutations($newelements);
        foreach($perms as $perm) {
            $newperms[]= $element."-".$perm;
        }
    }
    return $newperms;
}

テストしていないので、まだ作業があります;-)

于 2013-02-21T08:59:20.093 に答える
2

何が必要かわかりませんが、これらの順列を作成しようとしていますか?

これで始められるはずです。必要なサイズのセットで完全な順列を実行します。いくつかの注釈を追加しました。アイデアを得ることができるはずです

$array = array('A','B','C', 'D'); 
$permutations = array($array);
$perm_pool = range(0, count($array)-1);

function getPermutation($p, $size){
    // we pass in an array of integers, basically pointers, we want to see when we've fully reversed the set
    for ($i = $size-1; $p[$i] >= $p[$i+1]; $i--){}
    // the array starts at [1,2,3,4], when we've reached [4,3,2,1], we're done.
    if ($i == -1) { return false; }

    // slide down to the next largest number, this will be our next swap
    for ($j = $size; $p[$j] <= $p[$i]; $j--) {}

    // swap it
    $tmp = $p[$i];
    $p[$i] = $p[$j];
    $p[$j] = $tmp;

    // reverse the arrangement by swapping the head and tails
    for ($i++, $j = $size; $i < $j; $i++, $j--){
        $tmp = $p[$i];
        $p[$i] = $p[$j];
        $p[$j] = $tmp;  
    }
    return $p;
}

$i=1;
while($perm_pool=getPermutation($perm_pool, count($array)-1)){
    foreach($perm_pool as $p){
        $permutations[$i][] = $array[$p];
    }
    $i++;

}
于 2013-02-21T09:00:58.303 に答える