2013-03-03 52 views
0

這是一個簡單的程序,用於查找在稍後階段檢查數字劃分的素數。PHP代碼在處理大量數據時需要很多時間執行

我試圖通過初始化該數字的整數平方根來縮短它的複雜性。但仍然需要花費很多時間來執行腳本。什麼樣的改變,我可以實現我的代碼以減少執行時間(我已經設置最長執行時間爲5分鐘)

<?php 
error_reporting(E_ALL); 
$num = 600851475143; 
//$sqrt_num = (int)sqrt($num); 

for($j = 2; $j <= $num; $j++) 
{ 
    for($k = 2; $k < $j; $k++) 
    { 
     if($j % $k == 0) 
     { 
     break; 
     } 

    } 
    if($k == $j) 
    { 
     //echo "Prime Number : ", $j, "<br>"; 
     if($num % $j == 0) 
     { 
     echo "Prime number : ", $j, "<br>"; 
     } 
    } 
} 

編輯就評論道線開方,因爲這似乎是正確的。但仍然需要很多時間。

+1

數字有多大?每個人都會在某種程度上被優秀的代碼所感染,但如果它的大小有限,那麼緩存頭幾千個素數可能會更快,而不是每次計算它們。而且,因爲它們不會改變,所以你不需要第一次對它們進行整理,因此不用緩存就可以讀取「hardcode」。 – Nanne 2013-03-03 09:02:41

+0

@Nanne你的意思是我首先把它們全部放在一個數組中,然後對數字進行除法運算?請澄清一下 – swapnesh 2013-03-03 09:09:17

+0

@swapnesh部門?沒有。我的意思是你把所有素數放入一個數組中。然後你有一系列素數,你可以像在這裏做的那樣迴應絕對值。不需要做計算。但是這將有助於瞭解您需要解決的實際問題是什麼? – Nanne 2013-03-03 09:30:46

回答

2

一個改進代碼的執行時間的方法是這樣的:

$num = 1000; 

for($j = 2; $j <= $num; $j++) 
{ 
    $cond = sqrt($j); 
    for($k = 2; $k <= $cond; $k++) 
    { 
     if($j % $k == 0) 
     { 
     break; 
     } 

    } 
    if($k > $cond) 
    { 
     echo 'Prime number: ' . $j . '<br>'; 
    } 
} 

但沒有必要從每一次的遊戲內計算素數。您可以每隔30秒記住一次,將結果保存到數據庫,文件或數組,然後重新啓動腳本,該腳本應該從停止的地方繼續。

+1

thx很多兄弟:) – swapnesh 2013-03-03 10:20:03

+0

爲了提高執行時間甚至更多:在循環前處理2,然後從3乘以2計數兩個循環。 – 2013-03-03 10:57:02

2

減少此代碼執行時間的最佳方法是刪除它。 每次運行時都沒有必要計算每個素數 - 它們不會很快改變。

運行一次,將其寫入文件或數據庫,並在需要時使用它。 我親自把它放在一個數組中供以後使用。

+0

我把它,它是一個數組和仍然沒有足夠的時間用於更小的編號..check http://codepad.org/bJUjoom6 – swapnesh 2013-03-03 10:00:44

1

下面是通過試用分解進行保理的基本算法;我不知道PHP,所以我就放棄僞代碼:

function factors(n) 
    f, fs := 2, [] 
    while f * f <= n 
     while n % f == 0 
      append f to fs 
      n := n/f 
     f := f + 1 
    if n > 1 append n to fs 
    return fs 

有比這更好的方法來發現許多的因素,但即使是簡單的方法應該是足夠的項目歐拉問題,你正在努力解決;你應該在不到一秒鐘的時間內擁有一個解決方案。當您準備好使用素數編程時,我會在我的博客上謙虛地推薦這個essay

+0

thx很多的僞代碼..它真的會幫助我瞭解更多的編程概念..並感謝鏈接以及+1爲知識共享:) – swapnesh 2013-03-03 15:12:45

相關問題