- 締切済み
検索速度を速くするためには?
Visual Stdio 2005を使用してダイアログを作成しています。 エディットボックスからキーワードを入力して、テキストファイルから1行ずつ読み込みながら検索して、見付かればリストボックスに追加していますが、もっと検索速度を上げたいと思っています。 ちなみに、ファイルの中身は 1,あいうえお 2,かきくけこ 3,さしすせそ 4,あいうえお という感じで、100000行近くあります。 また、エディットボックスに入力した文字列とテキストファイルから読み込んだ文字列はCString型で、Findを使っています。 検索速度を上げる方法があれば教えて頂きたいです。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- mikaemi
- ベストアンサー率50% (33/65)
> ところで、配列に読み込む方法とはどんな方法ですか? この問いかけにはびっくりした^^; 処理時間ではなく、プログラミングの速度が問題のようなので、プログラムは変更せずに、今、ご自身で実装している方法をお薦めします(笑)
- mikaemi
- ベストアンサー率50% (33/65)
> すべて配列に読み込んでしまって、quick sort などの速いアルゴリズムでソートしてしまって、連続する同じ文字列を一つにしてしまう… あぁ、それで、ソートされているファイル中の文字列の配列が得られるので、入力されたキーワードがファイル中にあるかどうかは、このソート済み配列に対して、2分探索(C の bsearch() が行うようなこと)をかけてやればいいのではないですかね^^
お礼
ありがとうございます。 ところで、配列に読み込む方法とはどんな方法ですか? 現在はこんな風に実行していますが… CListBox* fileList2=(CListBox*)GetDlgItem(IDC_LIST2); fileList2->ResetContent(); fileList2->SetHorizontalExtent(0); CString String; UpdateData(TRUE); if(!abc.IsEmpty()){ CStdioFile File("abcde.txt",CFile::modeRead|CFile::typeText); while(File.ReadString(String)){ if(String.Find(abc)!=-1){ fileList2->InsertString(-1,String); } } File.Close(); }
- mikaemi
- ベストアンサー率50% (33/65)
バランス木やハッシュ表を作って、読み込んでは登録を繰り返しても早いでしょうが、登録は最初の一回でファイルをすべて調べるのであれば、すべて配列に読み込んでしまって、quick sort などの速いアルゴリズムでソートしてしまって、連続する同じ文字列を一つにしてしまうのが一番早いんじゃないでしょうか?一つの文字列が100Byte程度として10万行あっても、10MB 程度のメモリなので大丈夫でしょう。
お礼
これ以上検索速度を上げる方法がないという事ですか?