資料處理效率的問題..... |
尚未結案
|
shinlo
一般會員 ![]() ![]() 發表:7 回覆:15 積分:9 註冊:2002-04-14 發送簡訊給我 |
請教一下..... 如果我手上有一份資料,例如.... GGJJJABJUTTTAAGJBCBBTFG 注意紅色部分.... 我自己會準備一個陣列來儲存紅色字的部分....但是又不要改變其順序.... 也就是將GJABUTCF依序塞到我的陣列裡... 這不是很難的問題....但是我想用比較有效率的方法來做這件事情.... (目前我用了好幾個迴圈與buf陣列....而且是用比較直覺與效率差的方法,
雖然可以達到目的,但是往後如果資料量再擴充,整個時間就會被佔住..) 想請教各位是否有比較smart的做法,我是想盡量減少迴圈的使用量....^^"
|
supman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
|
rogan321
高階會員 ![]() ![]() ![]() ![]() 發表:21 回覆:307 積分:200 註冊:2003-05-15 發送簡訊給我 |
|
shinlo
一般會員 ![]() ![]() 發表:7 回覆:15 積分:9 註冊:2002-04-14 發送簡訊給我 |
ㄟ....我的資料是整數型態....但是不固定..... 重點就是對整個資料掃描....當掃描到第一次出現的資料時...就存放到我的陣列裡 然後往後的資料要是再重複出現時....就不予理會..... 所以,我的陣列裡會放資料的種類....而陣列的Index值就是資料本身被發現的順序.... 我的原始做法就是利用很多迴圈跟暫時使用的陣列....... 對原始資料先分類,然後計算各類的數量.... 最後再將找到的分類,依照原始資料出現的順序再重新排序一次.... 所以步驟很多....也很沒效率....故想請教一下有沒有比較有效率的做法...^^"
|
supman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
根據您的想法簡單的寫了一下,您看看吧,不知道會不會比您寫的更沒效率@@" procedure TForm1.Button1Click(Sender: TObject);
var
Str:Array[0..25] of String;
Result,CompStr:String;
Len,i:integer;
begin
CompStr:='GGJJJABJUTTTAAGJBCBBTFG';
Len:=Length(CompStr);
for i:=0 to 25 do Str[i]:='';
for i:=1 to Len do
begin
if (Str[Ord(CompStr[i])-65]='') then
begin
Str[Ord(CompStr[i])-65]:='1';
Result:=Result CompStr[i];
end;
end;
Showmessage(Result);
end; =========================
手上沒BCB,您自己修改一下摟,陣列迴圈要改一下. 發表人 - supman 於 2005/03/29 17:33:03
|
shinlo
一般會員 ![]() ![]() 發表:7 回覆:15 積分:9 註冊:2002-04-14 發送簡訊給我 |
謝謝supman兄....^^ 您的方法是很好的....不過我的資料型態是數字.... 可能我一開始的描述及舉例不是很明確...而造成困擾... 真是非常抱歉.....^^" 我的資料是一長串的數字....... 例如 5,5,2,2,2,7,3,3,3,2,4,4,4,2,2,7,7,7,5,5,1,1,2,7,101,178,101 數字並沒有一定的規律.... 但是我的目的是消去重複出現的數字,消去之後,還要按照數字發現的順序... 依序填入我的矩陣當中....不做任何的大小排序.... 可能的話...還要標註被發現的數字在原始資料的哪個位置被發現.... 我已經達到我想要的目的....但是我寫的程式實在是...唉~~(慘不忍睹...^^") 我用了4個迴圈,4個暫時使用的陣列....但是只是用來達到上述的目的...@@" 所以....想請教各位...是否有比較smart的做法?
|
supman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
|
shinlo
一般會員 ![]() ![]() 發表:7 回覆:15 積分:9 註冊:2002-04-14 發送簡訊給我 |
我的程式寫法是...
假設我的資料是100筆,資料範圍1~200 (這只是有限制性的假設...實際上可能沒有 ><") 我先設一個陣列 groupcount[200] (以資料範圍來定大小)
for(int i=0; i<100; i ) if(Data[i]!=0) groupcount[Data[i]] ; <=== 這樣就可以知道每一類的數量 for(int j=0; j<200; j ) if(groupcount[j]!=0) dif ; <=== 做完之後,我也可以知道有幾種之後也就利用上述這幾個東西來把原始資料再整理過..... 這樣就可以達到我要的目的..... 看起來是用土法煉鋼....而且也不太合實際..... 因為資料的大小與範圍有可能是未知的....所以我在創陣列groupcount[200] 時就已經是個錯誤....^^" 所以還煩請各位提供小弟一些比較通用與smart的做法....^^ ps:上面的程式,符號"加加"都沒出現....請各位注意一下^^" |
pwipwi
版主 ![]() ![]() ![]() ![]() ![]() 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
pkdemon
初階會員 ![]() ![]() 發表:2 回覆:51 積分:25 註冊:2004-09-13 發送簡訊給我 |
shinlo您好, 下面是比較直覺的想法,不知道對您有沒有幫助
int nArray[200], nCounter = 0; //nCounter : 有多少種類, nArray : 輸入的陣列 int nSort[200], nNumber[200]; //nSort : 出現的順序, nNumber : 依出現的順序列出出現次數 int i, j; memset(nArray, 0, sizeof(nArray)); memset(nSort, 0, sizeof(nSort)); memset(nNumber, 0, sizeof(nNumber)); for(i = 0 ; i < 200 ; i ) { if (nCounter == 0) { nSort[0] = nArray[0]; nCounter ; nNumber[0] = 1; } else { for(j = 0 ; j < nCounter ; j ) { if (nArray[i] == nSort[j]) { nNumber[j] ; break; } else { if (j == nCounter - 1) { nSort[nCounter] = nArray[i]; nNumber[nCounter] = 1; nCounter ; break; } } } } } |
supman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
如果您的資料是不確定大小也不確定範圍的話,絕對不要這樣寫,一來浪費記憶體,二來您可能在未來會遇到未知的記憶體錯誤,抓蟲抓到死= ="
因此您的陣列一定要做動態配置,以下是我自己土法煉鋼的方式,您參考看看,您要的資料都能得到
procedure TForm1.Button1Click(Sender: TObject); var int,Comp,Location:Array of integer; Result,Result1:String; i,j,Count:integer; Found:boolean; const Len:integer=6 ; begin SetLength(int,Len); SetLength(Comp,Len); SetLength(Location,Len); int[0]:=12;int[1]:=23;int[2]:=12;int[3]:=44;int[4]:=44;int[5]:=1; Count:=0; for i:=0 to Len-1 do Comp[i]:=0; for i:=0 to Len-1 do Location[i]:=0; for i:=0 to Len-1 do begin Found:=false; for j:=0 to Len-1 do if (int[i]=Comp[j]) then begin Found:=true; break; end; if (not Found) then begin Comp[Count]:=int[i]; Location[Count]:=i 1; Count:=Count 1; end; end; for i:=0 to Len-1 do if (Comp[i]<>0) then Result:=Result IntToStr(Comp[i]) ','; for i:=0 to Len-1 do if (Location[i]<>0) then Result1:=Result1 IntToStr(Location[i]) ','; Showmessage('數量:' IntToStr(Count)); ShowMessage('比對完資料:' Result); ShowMessage('位置:' Result1); end; |
shinlo
一般會員 ![]() ![]() 發表:7 回覆:15 積分:9 註冊:2002-04-14 發送簡訊給我 |
謝謝pwipwi,pkdemon,supman三位提供的方法...... pwipwi兄....您提供的方法,我還不會用...help裡面的也還稍微看不太懂...^^" pkdemon兄....您提供的方法,其實跟我的方法差不多...不過還是很謝謝您! ^^ supman兄....您的方法是目前最符合我的需求的方法,而且通用性很強.... 幾乎涵蓋所有可能發生的問題....也是很直覺的程式設計手法,一點都不複雜... 所以我把積分給supman兄....希望兩位見諒! (沒有辦法三位都給分....^^")
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |