• 締切済み

検索速度を速くするためには?

Visual Stdio 2005を使用してダイアログを作成しています。 エディットボックスからキーワードを入力して、テキストファイルから1行ずつ読み込みながら検索して、見付かればリストボックスに追加していますが、もっと検索速度を上げたいと思っています。 ちなみに、ファイルの中身は   1,あいうえお   2,かきくけこ   3,さしすせそ   4,あいうえお という感じで、100000行近くあります。 また、エディットボックスに入力した文字列とテキストファイルから読み込んだ文字列はCString型で、Findを使っています。 検索速度を上げる方法があれば教えて頂きたいです。よろしくお願いします。

みんなの回答

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3

> ところで、配列に読み込む方法とはどんな方法ですか? この問いかけにはびっくりした^^; 処理時間ではなく、プログラミングの速度が問題のようなので、プログラムは変更せずに、今、ご自身で実装している方法をお薦めします(笑)

purin0908
質問者

お礼

これ以上検索速度を上げる方法がないという事ですか?

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

> すべて配列に読み込んでしまって、quick sort などの速いアルゴリズムでソートしてしまって、連続する同じ文字列を一つにしてしまう… あぁ、それで、ソートされているファイル中の文字列の配列が得られるので、入力されたキーワードがファイル中にあるかどうかは、このソート済み配列に対して、2分探索(C の bsearch() が行うようなこと)をかけてやればいいのではないですかね^^

purin0908
質問者

お礼

ありがとうございます。 ところで、配列に読み込む方法とはどんな方法ですか? 現在はこんな風に実行していますが… 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)
回答No.1

バランス木やハッシュ表を作って、読み込んでは登録を繰り返しても早いでしょうが、登録は最初の一回でファイルをすべて調べるのであれば、すべて配列に読み込んでしまって、quick sort などの速いアルゴリズムでソートしてしまって、連続する同じ文字列を一つにしてしまうのが一番早いんじゃないでしょうか?一つの文字列が100Byte程度として10万行あっても、10MB 程度のメモリなので大丈夫でしょう。

関連するQ&A

  • 検索を1度だけにしたい。

    以前も投稿しましたが、まだわからないので質問します。 現在Visual Stdio 2005を使用してダイアログを作成しています。 エディットボックスからキーワードを入力して、テキストファイルから1行ずつ読み込みながら検索して、見付かればリストボックスに追加しています。 ちなみに、ファイルの中身は   1,あいうえお   2,かきくけこ   3,さしすせそ   4,あいうえお という感じで、100000行近くあります。 そこで、エディットボックスに入力した文字列とテキストファイルから読み込んだ文字列はCString型で、Findを使って読み込んだ文字列に含まれるかをチェックしていますが、全角文字列を検索しようとすると何度も検索されてしまっています。 (例えば検索したい文字列が「あいう」の全角3文字だと、最初は「あいう」、次に「あい」、最後は「あ」と、後ろから1文字ずつ減っていって検索されています。) この検索を最初の1度だけにしたいです。何か良い方法があればお願いします。

  • リストボックス内検索

    マクロ初心者です。 (エクセル2003を使用) ユーザーフォームにテキストボックスとリストボックスを作り、 リストボックス内のデータ(2列;ナンバーと文字、2500行くらい)の検索をテキストボックスに入力した文字で行いたいのですが、どうしていいのかわかりません。 ワークシート上では、Find関数を使ってできるのですが、リストボックス内の検索では使えませんか? inStr関数を使うのでしょうか? 検索がされたときのスクロールもできるといいのですが…。 よろしくお願いいたします。

  • GetWindowTextの使い方

    PocketPC2003を使ってアプリを使っているのですが エディットボックスに入力された文字列を 取得する方法が分からず困っております。 エディットボックスに対して、classwizardで CEdit型のm_zip変数を作成しました。 そこで、 CString buf; m_zip.GetWindowText(cs_buf); という所までは分かったのですが、これを char型の文字列にコピーしたいのですがどうすれば よいのでしょうか?。 開発環境は、 eMbedded Visual C++ 4.0です。

  • 複数行のエディットボックスで改行入力

    複数行のエディットボックスで改行入力 MFC ダイアログベースで、簡単なテキストエディタを作成しています。 エディットボックスは固定サイズで、縦横スクロール無しにしています。 上記エディットボックスに、改行の無い2行分の文字列を出力すると自動的に折り返され、 2行で表示されるのですが、そのとき、2行目の行頭でEnterキーを押すと、 カーソル位置で改行し、空行が挿入されます。(計3行分の表示となる) 10文字文の幅のエディットボックスにて、 文字列 "12345678901234567890" をエディットボックスに出力 エディットボックスでは下記の用に表示。 1234567890 1234567890 2行目の先頭でEnterキー押下で3行表示となる 1234567890 (空行) 1234567890 実際には、1行目の終わりに改行コードが挿入されているので 空行ではなく、改行された状態の2行表示としたいのですが、 どのようにすれば、よいでしょうか? よろしくお願いします。

  • CStringのFindで文字列検索を行いたいのですが

    こんにちは。 いつもお世話になっております。 CStringのFindメソッドで文字列検索を行っているのですが、文字列ではなくコードで検索が行われてしまい困っています。 ------------------------------------------------------- CString TargetStr; TargetStr = "ハヒフヘホ"; if(TargetStr.Find("z", 1) != -1){ return FALSE; } ------------------------------------------------------- 上記で文字"ホ"のコードが「837A」で"z"が「7A」のため、 文字列が存在するという結果が帰ってきます。 コードではなく文字そのものの検索をするにはどうしたらよいでしょうか? 基本的なことで申し訳ありませんが、ご教示下さい。 <環境> Windows 2000, VC6.0

  • ACCESSでの検索

    あいまい検索をしたいです。 【現状】 フォームデザインでテキストボックスを作り、検索ボタンを作成 ↓ 【したいこと】 マクロデザインで、「テキストボックスに文字列を入力すると、文字列を含むデータを抽出」 というまくろを組みたい。 [コード]=[Forms]![total]![コード入力]という、完全一致のものはここで教えていただいて作成できたのですが、もうひとつ、あいまい検索もしたいです。 あいまい検索は、「商品名」です。 宜しくお願いします。

  • Accessで文字列検索

    Accessであるテキストボックスに入ってるデータから任意の文字列の位置を知りたくて、 関数を使ってみました。 使った関数はFINDとSEARCHですがどちらもダメでした。 Accessで使える文字列検索関数はないのでしょうか?

  • エディットボックスの改行について

    よろしくお願いいたします。 環境 WIN98 VC++6.0 MFC にて 改行が可能なエディットボックスのデータをテキストファイルに保存すると、エディットボックスと同様に改行されて保存されます。 ファイルからデータを読出し、エディットボックスに表示する場合もちゃんと改行されていて問題ありません。 ここで、エディットボックスが2つあり、それぞれのエディットボックスのデータが2行あったとすると、ファイルには4行保存されます。 次にファイルからデータを読出し、エディットボックスに表示する場合、1個目のエディットボックスのデータが2行と分かっていれば良いのですが、そうでない場合は何行読み出してエディットボックスに表示すれば良いか分かりません。 そこで、1個目のデータを保存する時に、最終行の次の行にendという文字を保存することにしました。 これで、読み出すときはendを目印に必要な行数を読み出せます。 しかしながら、エディットボックスの文字の中にたまたまendが使われるとうまく行きません。 長くなりましたが、このような場合、一般的にはどのようにして対処すれば良いのでしょうか? お分かりの方よろしくお願いいたします。

  • エクセル2007VBAで検索するコードを知りたい。

    エクセル2007(Excel2007)のVBAで【検索と置換】と同等の機能をもった検索アプリケーションを作りたいのですが、 そのコード(コマンドボタンを実行したときのコード)を教えていただけないでしょうか。 (おそらくですが、リストボックスのコードも必要だと思います。) 正しくは、【検索と置換】から【置換】機能を無くしたものとイメージしていただきたいです。 ●設置するもの ユーザーフォーム(UserForm1) テキストボックス(TextBox1) コマンドボタン(CommandButton1) リストボックス(ListBox1) ●仕様 ユーザーフォームのテキストボックスに入力してコマンドボタンを押すと、検索対象を見つけ、 リストボックスにその対象一覧を行ごとに表示するものになります。 ●検索するときの条件 (1)大文字と小文字を区別しない (2)半角と全角を区別しない (3)部分一致すれば(一部でも一致すれば)検索対象にする (4)今、開いているワークシート上の「全てのセルが検索対象(列や行を指定しない)」 ※検索されたセルの存在する行ごとに、ユーザーフォームのリストボックスに(1行ずつ)表示したいです。 そして、リストボックスに表示されたデータのうち、どれか1つを選ぶと、その選択対象の行の【D列】にアクティブセルを移動するようにしたいです(画面もアクティブセルが見える位置にスクロールします)。 ●リストボックスに(1行ごとに)表示するもの● ↓↓↓ (左から)I列の値、D列の値、O列の値、Q列の値(→4列の値になります) ※リストボックスにQ列の値が表示された場合のみ(Q列に何かしらのデータがある場合のみ)、 リストボックス上の【その行の(I列の値、D列の値、O列の値、Q列の値の)文字すべてを赤色】にして表示していただきたいです。 分かる方がいましたらよろしくお願いいたします。

  • 文字のリアルタイム検索がしたいんです…

    質問を見てくださってありがとうございます。 少し説明が長いのですがどうぞ見てやって下さい。 さっそく質問内容なのですが…。 私がしたいと思っているのは文字列のリアルタイム検索です。まず、それが具体的にどういうことなのかを説明します。 あるFORM1にテキストボックスと一覧表示系コントロール(私が使っているのはTDBGridというコントロールです…)を配置しています。その一覧系コントロールには名前とそのフリガナが表示されます。その状態でテキストボックスにフリガナを入力して沢山あるリストの中から該当する名前(フリガナ)を検索しカレント行にする。というものなのですが、この時"リアルタイム検索"というのがどういうことかといいますと…。 一覧系コントロールに以下のような内容が表示されているとします。 -------------------- 名前  フリガナ -------------------- 相田  アイダ 飯田  イイダ 石狩  イシカリ 石川  イシカワ 渡   ワタリ -------------------- この中の"イシカワ"を検索する時…、 「イ」を入力すると飯田さんの行がカレント行になり 続いて「シ」を入力すると石狩さんの行がカレント行る。 更に「カ」を入力して「ワ」を入力すると石川さんの行がカレント行になるというものです。 これは入力した文字を一文字づつ認識してやり、一覧から検索してきて一番初めにヒットしたものを探し出してくるのですが、ここで問題となるのが入力した文字を一文字づつ認識させるということだと思うんですね。 実際は、入力しても一度[Enter]キーを押すまで、変換待ちになってしまいますから…。 ホントにどうしたらいいんでしょう…。 ずっと考えているのですが分からなくて困っています、わからないけどこうしたらどうかな??なんて回答でもいただけたら嬉しいのでどうぞ宜しくお願いしますm(__)m

専門家に質問してみよう