[請益] 運算陣列太大,會跑不太出來嗎?

看板PHP作者 (Maktub)時間14年前 (2010/04/20 16:32), 編輯推噓2(207)
留言9則, 5人參與, 最新討論串1/5 (看更多)
我的問題是這樣的 我有一組raw data 這組raw data各有一個start及end值 這兩個值的大小範圍 最小從0開始 最大可能會到 1500000 我想要用這些raw data 的start值到end值 的「出現次數」做累加 (除了start及end兩端點外,中間的值也會累加) 然後在數線上畫出累加的高度值 畫出來 會像一座座的山峰一樣 我的想法是我先宣告一個0到1500000的"0"陣列(raw data 中end可能出現的最大值) 然後讀到第一列資料時 會有另外一個陣列 將start到end之間的區段 給予 1 的數字 其他為 0 然後把這個陣列加到 一開始宣告的 0 陣列中 讀到第二列時 又得到某個區段為1的陣列 再加到 一開始的 0 陣列中 直到所有raw data 加完為止 然後再把最後加完的陣列的每一個元素 當做高度畫在數線上 以下是我的程式 $result = mysql_query(" select * from raw_data "); $arr = array_fill(0,1500000,'0'); //先宣告一個0陣列 while($row = mysql_fetch_array($result,MYSQL_BOTH)){ $start = $row["start"]; $end = $row["end"]; $base = array_fill($start,$end-$start+1,'1'); //start到end為1 $front = array_pad($base,-($end+1),0); //前面為0 $back = array_pad($front,$size+1,0); //後面為0 foreach($arr as $key => $value){ $arr[$key] = $arr[$key] + $back[$key]; //把每一陣列元素相加 } } for($i=0;$i<=$size;$i++){ //畫圖 if($arr[$i]!=0){ imageline($im,$start_x+$mod*$ratio,$quo*100-$arr[$i]+100,$start_x+$mod*$ratio,$quo*100+100,$green); } } 想請問 這樣的寫法 會不會因為陣列太大造成程式要跑很久? 因為我自己測了一下 程式應該沒錯 但是執行時 都跑不太出來 > < 是否還有其他 更有效率的寫法? 有請高人指點一下 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.109.32.11

04/20 17:14, , 1F
跑不出來 沒有出現錯誤訊息?
04/20 17:14, 1F

04/20 17:18, , 2F
有跑出來過 結果也是我要的 但是花了很久的時間 > <
04/20 17:18, 2F
※ 編輯: eco100 來自: 140.109.32.11 (04/20 17:30) ※ 編輯: eco100 來自: 140.109.32.11 (04/20 17:33)

04/20 18:38, , 3F
改用C/C++吧 或者ASP打NET都還比較快
04/20 18:38, 3F

04/20 21:45, , 4F
在DB中處理掉最快....
04/20 21:45, 4F

04/20 22:27, , 5F
如果允許, 換個格式存 raw_data 會更好...
04/20 22:27, 5F

04/20 22:32, , 6F
例: raw_data(index,num) ... 儲存時用 Update
04/20 22:32, 6F

04/20 22:32, , 7F
UPDATE raw_data SET num=num+1 WHERE index between ..
04/20 22:32, 7F

04/20 22:33, , 8F
start AND end
04/20 22:33, 8F

04/21 06:50, , 9F
跑很久 代表你的演算法可能出問題了啊 不然就是太複雜了
04/21 06:50, 9F
文章代碼(AID): #1BpMQQmu (PHP)
討論串 (同標題文章)
文章代碼(AID): #1BpMQQmu (PHP)