0

インターネットを詳細に検索したところ、順列に対処している PHP スクリプトのサンプルが多数見つかりました。これらのスクリプトはすべて、数個の数字と数個の単語をあちこちで置換するのには問題ありませんが、重い処理を実行する場合、コードを実行できません。

これが私たちが必要とすることの本質であり、私がしたことです。

1 から 8 までの数字の範囲の一意の組み合わせをすべて見つけなければなりません。これは簡単にできますが、問題はありません...

次に、クレイジーな数の結果になるはずの各組み合わせを並べ替える必要があり、各結果に対して文字列の置換を実行する必要があります...

私はこれが激しいことを知っています,,, そして、私は6までの数字でそれを成し遂げることができます.

6 の実行は非常に遅く、7 と 8 は単にマシンのメモリ割り当てを台無しにします。

私の主な質問は

順列を超高速で実行できる方法はありますか? できればメモリにあまり影響を与えずに...そしてPHPで実際に数百万のレコードを表示できる速度(コマンドラインで実行する、、、ブラウザはここでは関係ありません)

4

1 に答える 1

0

これが役立つかどうかはわかりませんが、10 個の数字 (0 -> 9) の順列を辞書順に生成するスクリプトを既に作成しました。配列のサイズ ...

数学的計算によると:10!= 60 秒で 3628800 回の順列、8! = 40320 の順列なので、(60 * 40320) / 3628800 = 0.67 秒で実行する必要があります。8 桁の順列のコードを変更する必要がある場合があります。PS: ブラウザが +3M の数値の出力を処理するかどうかはわかりません!

<?php

/* 0 - > 9 PERMUTATION SCRIPT */
ini_set('memory_limit', '512M');
ini_set('max_execution_time', '0');

$st = timer();


$permutations = array();

for($a=0;$a<=9;$a++){
    for($b=0;$b<=9;$b++){
        if($b != $a){
            for($c=0;$c<=9;$c++){
                if($c != $a && $c != $b){
                    for($d=0;$d<=9;$d++){
                        if($d != $a && $d != $b && $d != $c){
                            for($e=0;$e<=9;$e++){
                                if($e != $a && $e != $b && $e != $c && $e != $d){
                                    for($f=0;$f<=9;$f++){
                                        if($f != $a && $f != $b && $f != $c && $f != $d && $f != $e){
                                            for($g=0;$g<=9;$g++){
                                                if($g != $a && $g != $b && $g != $c && $g != $d && $g != $e && $g != $f){
                                                    for($h=0;$h<=9;$h++){
                                                        if($h != $a && $h != $b && $h != $c && $h != $d && $h != $e && $h != $f && $h != $g){
                                                            for($i=0;$i<=9;$i++){
                                                                if($i != $a && $i != $b && $i != $c && $i != $d && $i != $e && $i != $f && $i != $g && $i != $h){
                                                                    for($j=0;$j<=9;$j++){
                                                                        if($j != $a && $j != $b && $j != $c && $j != $d && $j != $e && $j != $f && $j != $g && $j != $h && $j != $i){
                                                                            $permutations[] = $a.$b.$c.$d.$e.$f.$g.$h.$i.$j;
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

echo count($permutations);


$et = timer();
$time = $et - $st;
echo "<br/>in : ".$time." seconds.";
function timer(){
    list($usec, $sec) = explode(" ", microtime());
    return((float)$usec + (float)$sec);
}

?>

編集: 1->8 順列スクリプト: ~0.43 秒。

<?php
$permutations = array();

for($a=1;$a<=8;$a++){
    for($b=1;$b<=8;$b++){
        if($b != $a){
            for($c=1;$c<=8;$c++){
                if($c != $a && $c != $b){
                    for($d=1;$d<=8;$d++){
                        if($d != $a && $d != $b && $d != $c){
                            for($e=1;$e<=8;$e++){
                                if($e != $a && $e != $b && $e != $c && $e != $d){
                                    for($f=1;$f<=8;$f++){
                                        if($f != $a && $f != $b && $f != $c && $f != $d && $f != $e){
                                            for($g=1;$g<=8;$g++){
                                                if($g != $a && $g != $b && $g != $c && $g != $d && $g != $e && $g != $f){
                                                    for($h=1;$h<=8;$h++){
                                                        if($h != $a && $h != $b && $h != $c && $h != $d && $h != $e && $h != $f && $h != $g){
                                                            $permutations[] = $a.$b.$c.$d.$e.$f.$g.$h;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

echo count($permutations);
?>
于 2012-10-13T09:26:48.577 に答える