處理極大的TXT檔 怎樣可以有效率的搜尋刪除裡面的內容? |
尚未結案
|
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
|
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
引言: 搜尋了半天 找不到解決我問題的方法 麻煩大家了 我程式的寫法還在規劃中 目前是想把所有的資料存成txt檔 資料內容單筆可能是4~9的字元 可是資料量可能多達 10的9次方 另外 我有一個StringGrid 需求就是 出現在StringGrid裡的值 跟txt比對 有相同的就從txt檔裡刪除 請問該怎樣去設計 請參考 【BCB】【問題】檔案比對 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=49608 每次要增加資料到txt 而不是整個覆蓋掉要怎麼做我只知道SaveToFile可以寫入 請參考 【BCB】【問題】如何更改二進制檔的內容 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=48278 如果只能用笨方法 每次都從檔案開頭一筆一筆比對 遇到一樣的刪除 又該怎麼做呢 可能很多人已經回答過了 找了一天文章 眼花花 真的沒發現 希望不厭其煩再回答我一次 萬分感謝 我把想寫的題目也說明一下好了 搞不好有高手想到我完全想不到的方法 我上的AI課程 老師要我們寫超變態猜數字 字數不限 值也不限(我想用1~9 a~z A~Z) 這樣可能性已經多到誇張了 判斷的方法 我打算用類似基因比對的演算法 配合消去法 可是苦於對程式寫法不熟 無能為力.... <>> >>< face="Verdana, Arial, Helvetica"> ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D ------------------------------- |
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
抱歉 程度太差 研究幾天的結果 我還是用稍微熟悉的memo去實作可是我發現
光是產生一個aaa.txt 裡面是0000~9999 用下面的程式去除有重複性制的數字
例如 1123 就要跑好久 五位數的更高達數小時 是程序的寫法太遜嗎 /.
txt檔裡的存法是 0000 0001 0002 0003 . . . AnsiString tmp; int i,j,k=0,size=4,t=0; char txt[key_size]={0},check[key_size],key[key_size]; bool b=true; Form1->Memo1->Lines->LoadFromFile("aaa.txt"); while(k<Form1->Memo1->Lines->Count) { b=true; tmp = Memo1->Lines->Strings[k]; strcpy(&key[0],tmp.c_str()); for(i=0;i第二個問題 當我程式中 猜的值為1234 結果是2A 那123X 12X4 1X34 X234(x為任意數字) 都是不可能的解 又該如何去刪除呢 如果用Memo1->Lines->Strings[k];搜尋 加上 把一筆資料拆成key[]四個值去逐一比對 刪除 跑好幾天都跑不完阿 T_T 第三個問題 如果是用TStringList 去作處理 是不是txt裡面一定要用逗號分開資料? 我看很多文章都是用 AnsiString sz=StringReplace(sl1->Strings[i], " ", ",", TReplaceFlags()< |
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
引言: 抱歉 程度太差 研究幾天的結果 我還是用稍微熟悉的memo去實作可是我發現 光是產生一個aaa.txt 裡面是0000~9999 用下面的程式去除有重複性制的數字 例如 1123 就要跑好久 五位數的更高達數小時 是程序的寫法太遜嗎 /.txt檔裡的存法是 0000 0001 0002 0003 . . . AnsiString tmp; int i,j,k=0,size=4,t=0; char txt[key_size]={0},check[key_size],key[key_size]; bool b=true; Form1->Memo1->Lines->LoadFromFile("aaa.txt"); while(k<Form1->Memo1->Lines->Count) { b=true; tmp = Memo1->Lines->Strings[k]; strcpy(&key[0],tmp.c_str()); for(i=0;i第二個問題 當我程式中 猜的值為1234 結果是2A 那123X 12X4 1X34 X234(x為任意數字) 都是不可能的解 又該如何去刪除呢 如果用Memo1->Lines->Strings[k];搜尋 加上 把一筆資料拆成key[]四個值去逐一比對 刪除 跑好幾天都跑不完阿 T_T 第三個問題 如果是用TStringList 去作處理 是不是txt裡面一定要用逗號分開資料? 我看很多文章都是用 AnsiString sz=StringReplace(sl1->Strings[i], " ", ",", TReplaceFlags()< |
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
|
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
引言: 其實這題目以前老師也出過,把剛剛建議你的STRUCT改一下感謝 對齁 我都忘記設passable 最近一直在煩惱字串處理和速度的問題 /.不過我最大的問題是 現在用4個數字在實作猜數字 可以了之後再慢慢增加 因為程式還頗菜 為什麼STRUCT可以增加速度阿 很明顯的嗎?(嘗試中) 我以前只知道struct看程式碼比較方便 一個不該是程式新手的新手 /.struct S_TestStruct { int Passable; char Num[4]; }TestStruct;初始化把每個Struct的Passable設為0 ,每猜一次若有可能符合的話Passable加 1 ,若判定為不可能Passable設為 -1, 每次隨機取一個Passable最大的值去猜 PS:這是多年以前寫的,我只能提供大概方向,這程式比較難的地方是如何判斷是否有可能符合 |
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
第一個問題:
你試試下面這一段Code,我的電腦大概1秒鐘就可以建立0000~9999並且不包含重複數字喔,只是技巧的問題啦,我想有時候要用歸納法推一下....
void __fastcall TForm1::Button1Click(TObject *Sender) { int sum=0; //驗證答案用 for(int i=0; i<10 ; i ) for(int j=i 1; j<10 ; j ) for(int k=j 1; k<10 ; k ) for(int m=k 1; m<10 ; m ) { Memo1->Lines->Add( ((AnsiString)i) ((AnsiString)j) ((AnsiString)k) ((AnsiString)m) ); sum ; } Edit1->Text = (AnsiString) sum; }答案剛好是210 = (10!) / ((4!)* (6!)) [/ |
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
1.倒不是struct就比較快,而是就這個程式而言,用BCB的AnsiString做處裡沒有直接把數字拆解來處理快(程式也比較容易寫). 2.
void __fastcall TForm1::Button1Click(TObject *Sender) { int sum=0; //驗證答案用 for(int i=0; i<10 ; i ) for(int j=i 1; j<10 ; j ) for(int k=j 1; k<10 ; k ) for(int m=k 1; m<10 ; m ) { Memo1->Lines->Add( ((AnsiString)i) ((AnsiString)j) ((AnsiString)k) ((AnsiString)m) ); //把i,j,k,m做排列組合就好啦,所以SUM的答案是210*(4!) sum ; } Edit1->Text = (AnsiString) sum; } |
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
引言:因為之前都沒有String的概念 用BCB才開始接觸 翻好久的文章 和看書都一知半解 無法實作 能給點方向嗎? 像我之前提到的txt檔 怎樣可以把它擷取在TStringList 並拿來作比對 刪除的動作 先建立一個TStrings用add方法,再使用assing方法將整個copy過去 <==完全沒概念 真是尷尬.... 一個不該是程式新手的新手 /.\建議第一個問題使用ADD不要使用DELETE 使用TStringList ADD方法 陣列會從後方加,無移動陣列 DELETE方法 陣列從中間移除後,中間到尾端往前移一格(你的程式在這兒時間浪費掉了) 使用DELETE的方法 先建立一個TStrings用add方法,再使用assing方法將整個copy過去(要移,移一遍就好,不然時間都浪費了)。學而時習之不亦樂乎! 發表人 - jest0024 於 2004/05/14 17:28:13 |
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
|
fredguo
一般會員 發表:0 回覆:1 積分:0 註冊:2004-04-20 發送簡訊給我 |
|
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
引言: 完蛋 程式已經完成50%左右 可是 堅持用array寫的結果 我發現爆掉了 如果需要建立array[99999999][10] 這麼大的陣列 有可能嗎 =.= 最主要是要和另一個陣列來比對例如 key[10] 就是拿key[10]跟array[0][10]~array[99999999][10]比對 可以的話也會慢到爆吧 請問該怎麼辦 T_T 一個不該是程式新手的新手 /.我想你比對的方向搞錯了喔,之前我曾建議你用Struct但是不代表你要建出所有的KEY值加以比對, 正確的做法應該是再加上動態產生你所需要的KEY值喔,我寫一段範例好了: class TestClass { public: int Passable; char *Num; TestClass() { Num = NULL; }; void CreateKey(int n=4) { if(Num) delete Num; Num = new char[n]; } ~TestClass(void) { if(Num) delete Num; }; }; void __fastcall TForm1::FormCreate(TObject *Sender) { int WordNum = 10; //0~9 10 共10個數字 int Choice = 4; //取4個數字 int Total=1; for(int i = WordNum-Choice-1 ; i<= WordNum ; i ) //計算共有幾個key值 Total*= i; TestClass *Key; Key = new TestClass[Total]; for(int i = 0 ; i |
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
|
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
引言: 對了順便告訴你2個加速的方式,以我剛剛的範例而言,當比對到某個KEY不可能的時候,除了把PASSABLE設為-1以外,更可以把他SWAP到array的最後面,然後用一個變數紀錄目前有效KEY的個數,下次就不用再比對;另外比對的時候根據不同的狀況,Passable值可以 1, 2, 3....(可能性越高加越多),不一定每次只加1 >>< face="Verdana, Arial, Helvetica"> 謝拉 提供了我不少方向 不過 如果這樣做的話 我一開始特地排序加快搜尋就沒用 再加上 這樣做真的很浪費時間和空間 所以我打算把銷去法拿掉 專心在基因比對的演算法 另外 真的感謝大家幫我的忙 可是分數只能給一個 請大家多多見諒 ^^ 一個不該是程式新手的新手 /.\ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |