2012-10-13 18 views
0

我已經在網上搜索很詳細,發現正在處理排列PHP腳本的許多樣品。所有這些腳本都可以在這裏和那裏排列幾個數字和幾個字,但是當我們執行一些重要的東西時,我無法執行代碼。非常快的排列在PHP

這裏是我做了我們需要的東西和事物的本質。

我必須從1至8 我這樣做很容易地找到一個數字範圍的所有獨特的組合,,沒有問題,有...

然後我要每個置換這將導致與組合瘋狂的結果數,,然後我不得不對每個結果執行字符串替換...

我知道這是激烈的,,,我也設法把它用數字做了長達6

6執行速度非常慢,而7和8只是簡單地混淆了機器上的內存分配。

我的主要問題是

有沒有一種方法可以讓我做排列超級快?最好在不影響存儲的太慘......有多快可以用PHP現實地顯示幾百萬條記錄(在命令行做,,,瀏覽器此處無關緊要)

+0

會像彩虹表一樣幫助嗎? http://en.wikipedia.org/wiki/Rainbow_table –

+0

如果命令行是一個選項,瀏覽器也沒有關係,我敢肯定有更好的工具來做到這一點比PHP。 – budwiser

+0

我同意你的budwiser。我認真需要儘可能快地找到這個PHP,但是,儘管如果有人也擁有它,我確實希望看到一個非常快速的C代碼。 – GRowing

回答

0

我不知道這是否會是有幫助的,但我已經作出,其產生10個號碼的置換腳本 - 在字典順序(0> 9),它在運行〜60秒[四核2.7GHz的],並使用512MB由於陣列尺寸...

通過數學計算:10!在60秒內= 3628800排列,8! = 40320排列,所以它應該運行在(60 * 40320)/ 3628800 = 0.67秒,比如說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

不尋常的代碼。謝謝。我會比較一下我對這件事的看法,看看它對我有什麼用。你的數組的print_r對我來說是0.47。我一定會更深入地看待這一點。與我所擁有的相比有了相當大的改進。我想知道是否有更清晰的方式來編寫它。 – GRowing

+0

哦,瀏覽器不關心我的需要,,我輸出它到CMD – GRowing

+0

「更清潔」當然有一個,但我已經花了幾個小時在「優化」這個代碼,你可以「壓縮」的代碼刪除空間等...... btw在C++中有一個名爲「next_permutation()」的函數它可以幫助你,所以祝你好運! – HamZa