-
stu6707
-
- 文章: 162
- 註冊時間: 2008-10-26 1:00 pm
由 stu6707 » 2011-05-14 4:48 am
可是我沒問題耶 =口= 我是用appsev 2.5.10,裡面的php 是PHP 5.2.6,也可以執行阿
怪了...
-
ETERNAL
-
- 文章: 2937
- 註冊時間: 2003-12-03 11:08 pm
- 性別: 男生
-
由 ETERNAL » 2011-05-14 11:41 am
stu6707 寫:可是我沒問題耶 =口= 我是用appsev 2.5.10,裡面的php 是PHP 5.2.6,也可以執行阿
怪了...
原來如此 用appsev的話 php.ini被改過了,不是原廠php.net的設定 原廠的php.ini設定的語法嚴整性跟安全性很高 語法上的錯誤有這幾個 1. <? 要改成 <?php
2. ${m.$no} 要改成 ${"m".$no}
其他應該沒什麼問題 我把你的程式改成可以跑不限層,現在在測試
水色論壇 http://www.et99.net 簡恩峻分享
-
stu6707
-
- 文章: 162
- 註冊時間: 2008-10-26 1:00 pm
由 stu6707 » 2011-05-14 11:57 am
喔喔 學習了 @@
我想我寫的走進誤區了.. 計算6,7個組合時沒問題,可以在很快的時間內算出
不過16種組合就非常花時間.. 題目有要求要在minutes得出結果
-
ETERNAL
-
- 文章: 2937
- 註冊時間: 2003-12-03 11:08 pm
- 性別: 男生
-
由 ETERNAL » 2011-05-14 12:07 pm
到e就跑不動了 已經過了大概有10分鐘,還沒跑出結果 @@ 給大家參考一下 - 代碼: 選擇全部
<?php //$f=$argv[1]; $f="data4.txt"; $show=file($f); $maxnum=sizeof($show); $m_final=array(); $m_list=array(); //set_time_limit(0); $st_time=time(); $sum=0; if($maxnum) { $loop=0; $st_no=99999; $end_no=0; for($i=0;$i<$maxnum;$i++) { $data=explode(" ",$show[$i]); $data[0]=substr($data[0], 1); $data[1]=substr($data[1], 1); $data[2]=substr($data[2], 1); $no=$data[1]; if($no <= $st_no) $st_no=$no; if(!isset(${"m".$no})) { ${"m".$no}=array(); } ${"m".$no}[]=array(0=>$data[0],1=>$no,2=>$data[2],3=>$data[3]); if($no >= $end_no) $end_no=$no; $m_list[$data[0]]["money"]=$data[3]; } $money_final=0; $total=$end_no-$st_no+1; foreach(${"m".$st_no} as $v) { $money=0; $t_m=array(); $t_n=array(); into($t_m,$t_n,$money,$v,$loop); schloop($t_m,$t_n,$money,($st_no+1),$loop); } asort($m_final); } $en_time=time(); echo "need time:".($en_time-$st_time)."秒"; //print_r($m_final); echo "<br>"; echo "========================"; echo "<br>"; echo $money_final."\n"; echo "<br>"; echo implode(" ",$m_final)."\n"; echo "<br>"; echo $loop; function schloop(&$t_m,&$t_n,&$money,$a1,$loop) { global ${"m".$a1},$end_no,$money_final,$m_final,$m_final,$total,$sum,$m_list; $loop++; if(!isset(${"m".$a1})) { return; } foreach(${"m".$a1} as $v) { $sum++; if(in_array($v[2],$t_n)) { continue; } into($t_m,$t_n,$money,$v,$loop); schloop($t_m,$t_n,$money,($a1+1),$loop); if(count($t_m)==$total) { if($money_final==0 || $money_final>$money) { $money_final=$money; $m_final=$t_m; } } $del=count($t_n)-1; $money-=$m_list[$t_m[$loop]]["money"]; unset($t_n[$loop],$t_m[$loop]); if($sum>5000) { //exit; } } } function into(&$a1,&$a2,&$a3,$v,$a4) { $a1[$a4]=$v[0]; $a2[$a4]=$v[2]; $a3+=$v[3]; } ?>
裡面有set_time_limit(0); 若怕跑不完,記得把set_time_limit(0);拿掉
水色論壇 http://www.et99.net 簡恩峻分享
-
stu6707
-
- 文章: 162
- 註冊時間: 2008-10-26 1:00 pm
由 stu6707 » 2011-05-14 1:40 pm
有個問題..
data4.txt裡面的M,C,price 一定是被一個空白格開,我是直接從網站複製下來,中間都是被3個空白隔開
還是需要用trim and preg_match來刪除多餘空白
-
ETERNAL
-
- 文章: 2937
- 註冊時間: 2003-12-03 11:08 pm
- 性別: 男生
-
由 ETERNAL » 2011-05-15 12:08 am
stu6707 寫:有個問題..
data4.txt裡面的M,C,price 一定是被一個空白格開,我是直接從網站複製下來,中間都是被3個空白隔開
還是需要用trim and preg_match來刪除多餘空白
恩 是可以的 你可以改良一下在放上來 我剛想到一個方式可以加快計算一下速度 明天改上來
水色論壇 http://www.et99.net 簡恩峻分享
-
stu6707
-
- 文章: 162
- 註冊時間: 2008-10-26 1:00 pm
由 stu6707 » 2011-05-15 5:10 am
- 代碼: 選擇全部
$data=explode(" ",$show[$i]);
上面加入 - 代碼: 選擇全部
$show[$i]=preg_replace('/[\n\r\t]/',' ',preg_replace('/\s(?=\s)/','',trim($show[$i])));
我昨天從5.30跑到12.00,結果還沒出來.... 不知是程式自動停止了還是真的需要跑好幾小時
-
ETERNAL
-
- 文章: 2937
- 註冊時間: 2003-12-03 11:08 pm
- 性別: 男生
-
由 ETERNAL » 2011-05-15 10:46 am
哈哈 你是跑 a b c d e f g 的哪一個? 你用下面這段程式跑看看,過程做了修改,也把你的檢查放進來 可以讓速度提高2-3倍,原本我跑d需要44秒,現在只要16秒 - 代碼: 選擇全部
<?php //$f=$argv[1]; $f="data4.txt"; $show=file($f); $maxnum=sizeof($show); $m_final=array(); $m_list=array(); set_time_limit(0); $st_time=time(); $sum=0; if($maxnum) { $loop=0; $st_no=99999; $end_no=0; for($i=0;$i<$maxnum;$i++) { $show[$i]=preg_replace('/[\n\r\t]/',' ',preg_replace('/\s(?=\s)/','',trim($show[$i]))); $data=explode(" ",$show[$i]); $data[0]=substr($data[0], 1); $data[1]=substr($data[1], 1); $data[2]=substr($data[2], 1); $no=$data[1]; if($no <= $st_no) $st_no=$no; if(!isset(${"m".$no})) { ${"m".$no}=array(); } ${"m".$no}[]=array(0=>$data[0],1=>$no,2=>$data[2],3=>$data[3]); if($no >= $end_no) $end_no=$no; $m_list[$data[0]]["money"]=$data[3]; } for($i=$st_no;$i<=$end_no;$i++) { usort(${"m".$i}, 'sort_by_money'); } $money_final=0; $total=$end_no-$st_no+1; foreach(${"m".$st_no} as $v) { $money=0; $t_m=array(); $t_n=array(); $t_m[$loop]=$v[0]; $t_n[$loop]=$v[2]; $money+=$v[3]; //into($t_m,$t_n,$money,$v,$loop); schloop($t_m,$t_n,$money,($st_no+1),$loop); } asort($m_final); } $en_time=time(); echo "need time:".($en_time-$st_time)."秒"; echo "<br>"; echo "========================"; echo "<br>"; echo $money_final."\n"; echo "<br>"; echo implode(" ",$m_final)."\n"; echo "<br>"; echo $loop; function schloop(&$t_m,&$t_n,&$money,$a1,$loop) { global ${"m".$a1},$end_no,$money_final,$m_final,$m_final,$total,$sum,$m_list; $loop++; if(!isset(${"m".$a1})) { return; } foreach(${"m".$a1} as $v) { $sum++; if(in_array($v[2],$t_n)) { continue; } $t_m[$loop]=$v[0]; $t_n[$loop]=$v[2]; $money+=$v[3]; //into($t_m,$t_n,$money,$v,$loop); if($money>$money_final && $money_final!=0) { $del=count($t_n)-1; $money-=$m_list[$t_m[$loop]]["money"]; unset($t_n[$loop],$t_m[$loop]); //del_array($t_n,$t_m,$money,$loop); return; } schloop($t_m,$t_n,$money,($a1+1),$loop); if(count($t_m)==$total) { if($money_final==0 || $money_final>$money) { $money_final=$money; $m_final=$t_m; } } $del=count($t_n)-1; $money-=$m_list[$t_m[$loop]]["money"]; unset($t_n[$loop],$t_m[$loop]); //del_array($t_n,$t_m,$money,$loop); } } function into(&$a1,&$a2,&$a3,$v,$a4) { $a1[$a4]=$v[0]; $a2[$a4]=$v[2]; $a3+=$v[3]; } function sort_by_money($a, $b) { if($a[3] == $b[3]) return 0; return ($a[3] > $b[3]) ? 1 : -1; } function del_array(&$t_n,&$t_m,&$money,$loop) { global $m_list; $del=count($t_n)-1; $money-=$m_list[$t_m[$loop]]["money"]; unset($t_n[$loop],$t_m[$loop]); } ?>
另外發現到,不去call function 可以讓程式比較快 用d來測試,去call function 需要20秒 不去call function可以縮短到16秒 你可以測試看看
水色論壇 http://www.et99.net 簡恩峻分享
-
ETERNAL
-
- 文章: 2937
- 註冊時間: 2003-12-03 11:08 pm
- 性別: 男生
-
由 ETERNAL » 2011-05-15 10:51 am
不過 e 我到現在還是一樣沒跑出來
如果你測試出來的話,麻煩把圖貼上來
我想知道要花幾秒鐘 = =
水色論壇 http://www.et99.net 簡恩峻分享
-
stu6707
-
- 文章: 162
- 註冊時間: 2008-10-26 1:00 pm
由 stu6707 » 2011-05-15 11:31 am
我跑 g........最長的那個 @@
用沒些改過的今天跑了6小時,還是沒出來.....
剛剛換上新程式碼在跑一遍,希望晚上可以出來...
-
ETERNAL
-
- 文章: 2937
- 註冊時間: 2003-12-03 11:08 pm
- 性別: 男生
-
由 ETERNAL » 2011-05-15 2:11 pm
@@ 我想應該有更快的方法吧
可能有什麼特別的計算方式,可以更有效率的找出解答
水色論壇 http://www.et99.net 簡恩峻分享
-
stu6707
-
- 文章: 162
- 註冊時間: 2008-10-26 1:00 pm
由 stu6707 » 2011-05-15 3:19 pm
新程式碼已經跑了快4個小時,還是沒出來......
而且資源吃好多,90%的CPU & 1xx,xxx k記憶體 @@
已經嚴重拖慢電腦運作速度了 OTL 不得不關掉了
找天掛個10小時,看他出不出來..
-
ETERNAL
-
- 文章: 2937
- 註冊時間: 2003-12-03 11:08 pm
- 性別: 男生
-
由 ETERNAL » 2011-05-15 3:24 pm
stu6707 寫:新程式碼已經跑了快4個小時,還是沒出來......
而且資源吃好多,90%的CPU & 1xx,xxx k記憶體 @@
已經嚴重拖慢電腦運作速度了 OTL 不得不關掉了
找天掛個10小時,看他出不出來..
是喔 @@ 我是用4核心的CPU來跑,還好php是單執行緒,最多只吃掉我一個核心25% 記憶體1xx,xxx k很正常,我火狐多開了幾頁看網站也吃掉這麼多 @@
水色論壇 http://www.et99.net 簡恩峻分享
-
stu6707
-
- 文章: 162
- 註冊時間: 2008-10-26 1:00 pm
由 stu6707 » 2011-05-15 3:32 pm
怎麼差這麼多 =口= 我是雙核的,吃掉90%,四核才吃掉1/4
工作管理員顯示CPU都是被 http.exe (apache server)吃掉的
看來自架站真不好做
-
ETERNAL
-
- 文章: 2937
- 註冊時間: 2003-12-03 11:08 pm
- 性別: 男生
-
由 ETERNAL » 2011-05-15 9:04 pm
stu6707 寫:怎麼差這麼多 =口= 我是雙核的,吃掉90%,四核才吃掉1/4
工作管理員顯示CPU都是被 http.exe (apache server)吃掉的
看來自架站真不好做
我也是自架阿 雙核的話,正常來講應該只有50%是被apache server吃掉吧 另外40%應該是其他東西??
水色論壇 http://www.et99.net 簡恩峻分享
|