PHP中非常快速的排列

问题描述 投票:0回答:2

我已经在互联网上进行了非常详细的搜索,发现了许多解决排列问题的PHP脚本示例。所有这些脚本都可以在这里和那里排列一些数字和几个单词,但是当我们执行一些繁重的工作时,我将无法执行代码。

这是我们需要做的事情和我所做的事情的本质。

我必须找到从1到8的数字范围的所有唯一组合。我很容易做到这一点,那里没有问题...

然后,我必须置换每个组合,这些组合应该导致一个疯狂的数字结果,然后我必须对每个结果执行字符串替换...

我知道这很激烈,而且我确实设法用最多6个数字来完成它。

6执行起来非常慢,而7和8只会弄乱机器上的内存分配。

我的主要问题是

有没有一种方法可以超快速地进行排列?最好在不严重影响内存的情况下...以及在PHP中实际可以显示几百万条记录的速度(在命令行中执行,浏览器在这里无关紧要)

php permutation
2个回答
0
投票

我不知道这是否会有所帮助,但是我已经制作了一个脚本,可以按字典顺序生成10个数字(0-> 9)的排列,并且它以〜60sec [Quadcore 2.7Ghz]运行,并使用512MB由于数组大小...

通过数学计算:10! = 60秒内3628800排列8! = 40320排列,因此应该以(60 * 40320)/ 3628800 = 0.67sec的速度运行1秒!您可能需要更改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);
?>

0
投票

Permutations - all possible sets of numbers

我的机器上的此递归算法f(10!)需要5秒钟与HamSa为此脚本的f(9!)的7秒比较]

© www.soinside.com 2019 - 2024. All rights reserved.