線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1044
推到 Plurk!
推到 Facebook!

資料處理效率的問題.....

尚未結案
shinlo
一般會員


發表:7
回覆:15
積分:9
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-29 13:11:52 IP:202.145.xxx.xxx 未訂閱
請教一下.....    如果我手上有一份資料,例如....    GGJJJABJUTTTAAGJBCBBTFG 注意紅色部分.... 我自己會準備一個陣列來儲存紅色字的部分....但是又不要改變其順序.... 也就是將GJABUTCF依序塞到我的陣列裡... 這不是很難的問題....但是我想用比較有效率的方法來做這件事情.... (目前我用了好幾個迴圈與buf陣列....而且是用比較直覺與效率差的方法, 雖然可以達到目的,但是往後如果資料量再擴充,整個時間就會被佔住..) 想請教各位是否有比較smart的做法,我是想盡量減少迴圈的使用量....^^"
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-29 13:45:59 IP:61.70.xxx.xxx 未訂閱
您好: 不曉得您這些資料是否有規則,請提供一下,或者提供您現在的做法,以便解析怎麼寫會比較好.
rogan321
高階會員


發表:21
回覆:307
積分:200
註冊:2003-05-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-29 14:58:08 IP:203.204.xxx.xxx 未訂閱
資料在運算時即讓其順便標註紅字的位置~ 當要撿紅字時~則不須再運算~直接抓標註的位置來存放~ 參考~參考~
shinlo
一般會員


發表:7
回覆:15
積分:9
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-29 15:03:01 IP:202.145.xxx.xxx 未訂閱
ㄟ....我的資料是整數型態....但是不固定..... 重點就是對整個資料掃描....當掃描到第一次出現的資料時...就存放到我的陣列裡 然後往後的資料要是再重複出現時....就不予理會..... 所以,我的陣列裡會放資料的種類....而陣列的Index值就是資料本身被發現的順序.... 我的原始做法就是利用很多迴圈跟暫時使用的陣列....... 對原始資料先分類,然後計算各類的數量.... 最後再將找到的分類,依照原始資料出現的順序再重新排序一次.... 所以步驟很多....也很沒效率....故想請教一下有沒有比較有效率的做法...^^"
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-29 17:29:17 IP:61.70.xxx.xxx 未訂閱
根據您的想法簡單的寫了一下,您看看吧,不知道會不會比您寫的更沒效率@@" 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-30 15:45:33 IP:202.145.xxx.xxx 未訂閱
謝謝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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-30 18:56:23 IP:61.70.xxx.xxx 未訂閱
如果可以的話把原始碼貼上來,我看看怎麼改會比較好些,或者是否可以利用TStringList來簡化原始碼?
shinlo
一般會員


發表:7
回覆:15
積分:9
註冊:2002-04-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-31 00:03:23 IP:221.169.xxx.xxx 未訂閱
我的程式寫法是... 假設我的資料是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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-31 00:46:09 IP:211.76.xxx.xxx 未訂閱
可以用STL中的map達到你的需求  
 
#include     std::map groupcount;
for(int i=0; i<100; i  )
    if(Data[i]!=0)
        groupcount[Data[i]]  ;// <=== 這樣就可以知道每一類的數量
int dif = groupcount.size();//<=== 做完之後,我也可以知道有幾種
修改你的例子用map來實作...不過我沒試著compile,請你自已研究看看吧~
pkdemon
初階會員


發表:2
回覆:51
積分:25
註冊:2004-09-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-03-31 11:13:57 IP:60.248.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-03-31 11:19:40 IP:61.70.xxx.xxx 未訂閱
如果您的資料是不確定大小也不確定範圍的話,絕對不要這樣寫,一來浪費記憶體,二來您可能在未來會遇到未知的記憶體錯誤,抓蟲抓到死= =" 因此您的陣列一定要做動態配置,以下是我自己土法煉鋼的方式,您參考看看,您要的資料都能得到  
 
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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-04-06 12:02:56 IP:202.145.xxx.xxx 未訂閱
謝謝pwipwi,pkdemon,supman三位提供的方法...... pwipwi兄....您提供的方法,我還不會用...help裡面的也還稍微看不太懂...^^" pkdemon兄....您提供的方法,其實跟我的方法差不多...不過還是很謝謝您! ^^ supman兄....您的方法是目前最符合我的需求的方法,而且通用性很強.... 幾乎涵蓋所有可能發生的問題....也是很直覺的程式設計手法,一點都不複雜... 所以我把積分給supman兄....希望兩位見諒! (沒有辦法三位都給分....^^")
系統時間:2024-05-14 5:25:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!