• ベストアンサー

検索アルゴリズム

 今、高速な検索アルゴリズムを探しています。  下記の条件のときに使えるアルゴリズムが何かないか、ご存知の方おしえてください。   1.データの順番は基本的にバラバラ   2.トゥリーやインデックスは検索の直前に作る  よろしくお願いします。

noname#25358
noname#25358

質問者が選んだベストアンサー

  • ベストアンサー
  • alfeim
  • ベストアンサー率58% (114/195)
回答No.7

>Perl からSQLが呼べないかなぁと >PasageSQLやMySQLだと一般プロバイダのCGI環境では使えないから SQL自体はそれぞれのモジュールがあると思います (少なくともPostgresはPg.pmがあります) 一般プロバイダでは使えませんが、海外などのFreeWebサービスではMySQLやPostgresを遣わせてくれる所もありますよ また、DataBaseは通常Networkアクセスできるように作ってあるので設定まで出来る所であれば、webサーバ(Perlプログラムが動いてる所ですね)とDBサーバは別々に出来ます またODBCドライバモジュールがあれば大体のDetabaseは使えるはずです(多分探せばODBC用perl moduleがあると思います・・・自信無いですが(^^;) SQL Serverの内部解説書ですが、私が読んだのは 出版社: リックテレコム 書名: リファレンス WindowsNTによるSQL Server6.5チューニングガイド 著者: 飛鳥 亮 定価: 2800円(税別) ISBN: 4-89797-211-6 です ちょっと古い本ですが、まだ手に入るようです>参考URLを参照してください >オープンソースのデータベースソフトがあるのなら、それもご紹介いただきたいんですが……(^_^; オープンソースのデータベースソフトはPostgreSQLやMySQLがそうですよ(^^; PostgreSQLは http://www.sra.co.jp/people/t-ishii/PostgreSQL/ からダウンロードできるはずです MySQLはこちら http://www.softagency.co.jp/mysql/

参考URL:
http://www.amazon.co.jp/exec/obidos/ASIN/4897972116/qid%3D983533864/249-2995887-0212321
noname#25358
質問者

お礼

 ありがとうございます。  まあ、「手軽に使える」ことを売りにしてますからね。少なくともそれだけは誰にも負けないはずです(笑)  解説書は、財布と相談したうえで、ヒモが緩んでくれれば買いたいと思います(笑)  URLの方はさっそくソースを落としに行きたいと思います。

その他の回答 (6)

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.6

なんかDatabaseのようなものを作ろうとしてらっしゃるみたいですね・・・ であれば一番手っ取り早いのはDatabaseに突っ込んでSQLでQueryするってのが一番早いですが(笑) 結局自分で実装するにしてもDBと同じ手法を使う事になるでしょう データを一意に識別出来るindexを付けてやり それぞれの項目毎にB木やバランスツリー、ハッシュなどで一意識別できるindexとキーを関連付けてやります それで検索条件毎にそれぞれの項目毎のツリーなどからindexを限定してやって、最後にindexから実体を出力してやる、という方法が使えると思います また、検索条件の最適化を行うと言う事も(条件によっては)出来るでしょう ・・・以上の事は実際のdatabaseがやってる事です(^^; MS SQL Serverなどの内部動作解説本などがあるのでそういう物を読むか、OpenSourceなDatabaseのSourceCodeを調べるのもいいかもしれません

noname#25358
質問者

お礼

 そぉです(^_^; Perl からSQLが呼べないかなぁと思って、今作ってるんです(笑)(←PasageSQLやMySQLだと一般プロバイダのCGI環境では使えないから、といったようなコンセプト)  つっても、ver.1 はすでにヴェクターに登録申請しましたけど。  MS SQL Server の解説書はめちゃくちゃ欲しいです(笑) 本屋にありますか?  オープンソースのデータベースソフトがあるのなら、それもご紹介いただきたいんですが……(^_^;

回答No.5

条件としては一般にどんなものが与えられるんでしょう? 項目A =~ /regexp/ && !(項目B =~ /regexp/ && 項目C =~ /regexp/) ぐらい一般的なんでしょうか? あと、検索の回数に関してですが、アプリケーションから1回呼ば れるごとに1回検索するだけなんですね? で、2回目の検索というのがあったとしたとき、CSVのデータに変更 がある可能性もあって、そのことを知るすべがないのでしょうか? そうだとすると、前から順に探すくらいしか思いつきません。

noname#25358
質問者

お礼

 ありがとうございます。  条件文はだいたいおっしゃるとおりです。  入力されたSQL文に対して条件にマッチするデータを抽出します。  で、検索回数は、1回の呼び出しに対して1回のみです。1回目の呼び出しでインデックスを作って2回目からはそれを使うという手もアリですが、そのインデックスは「ありとあらゆる条件」において流用できなければ実用できません(^_^;  ……こんなところです。  はっきりいって、現状を保つ(線形検索する)か袋小路で迷うかといったような瀬戸際ですね(笑)  今のところ前者に心が動いておりますけれども(笑)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.4

#3を書いた後で#1への補足を読んだのですが、線形文字列検索ではダメですか? CSVファイル内の任意の文字列を高速検索するならBM法で何とかなるかでしょう。 アルゴリズム辞典で確認してください。

noname#25358
質問者

お礼

 ありがとうございます。  駄目ってことはないんですが、言語が Perl なので、できれば高速化したいんです。あと、文字列検索ではなく、厳密にはデータ抽出ですね(^_^;  今のところ、処理能力が秒間600件(セルロン300)ですが、これだとちょっと弱いので……。  でも、各アルゴリズムの処理速度を見ていると、何だか線形検索が最速のような気がしてきました(笑)  線形検索なら速度が最善だろうが最悪だろうが O(n) にできますし。  とりあえず、条件文の解析の高速化とか、そういう方面でやってみます(^_^;

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

順次検索や大小比較が必要無いならハッシュで行けますね。 ハッシュ表を使わずにデータをほおりこめばインデックスもツリーも不要です(容量的には不利ですが)。 検索の“直前”であろうと“事前”であろうと「ツリーやインデックスを作る」のならB木で良いような気もしますが…。

noname#25358
質問者

補足

 ありがとうございます。  「ハッシュ表を使わずにデータを放り込む」とはどういうロジックなんでしょう? データそのものをハッシュ値として使うのでしょうか。  それから、ツリー(インデックス)を直前に作るのは、検索条件が複数であるためです。  B木検索ではいけない理由は、それを作るためにソートを行うと、条件1、条件2……条件nというように条件の個数分だけソートを行わなければならないことになり、結果として処理速度が落ちるのです(^_^;  なぜそういうことをするのかというと、1つのデータは複数の項目を持っており、条件1では項目Aをキーとして検索を行い、条件2では項目Bをキーとして検索を行う、ということをやるからなわけです。  データの内容もこちらが予測したものってわけにもいかないので、データの種類に前提を作ることもできませんし……。

回答No.2

1回しか探索しないのだとすると、木を作る間に探せてしまうでしょ うから、何度も探索するのを木で高速化したいということでよろし いでしょうか? そういう目的なら2分探索木かB木ということになると思います。前 者はバランスが悪い木になってしまうと、リニアサーチと変わらな くなります。順序がバラバラといっても、もし部分的にソートされ てたりする可能性があるなら、後者を使うべきでしょうね。 どちらも、 「C言語による最新アルゴリズム事典」奥村晴彦・技術評論社 で解説されています。

noname#25358
質問者

補足

 ありがとうございます。  検索回数に関しては……。  まず俺が作っているのは、他のプログラムから呼び出されるモジュールです。  アプリケーションからの要求に応じてCSVファイルの中身を読み込み、サーチします。よって、1回しか検索しないかどうかについては何とも言えないのです(^_^;  ちなみに、データそのものもアプリケーションが用意した物を使うので、部分的にソートされている可能性があるとも言えるし、ないとも言えます。  どっちにしろご指定の本は便利そうですね。  本屋で探してみようと思います。

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.1

データの内容によって色々変わってくると思うのですが・・・ キーの重複の有無、 キーのデータとの完全一致か、一部との一致か などありますので、もう少し具体的な補足をお願いします

noname#25358
質問者

補足

 ありがとうございます。  そういう条件もあるのですね。  データは基本的に、「ありとあらゆるデータ」が来る可能性があります。テキスト形式で記述されたCSVファイルの中身を検索するためのものだからです。  よって、キーが重複することもありえます。また、1回の検索で複数のデータが取得できてしまうこともありえます。  完全一致とかそういうのは、正規表現でなんとでも対処できるので、部分一致は考えなくていい、というところです。  よろしくお願いします。

関連するQ&A

  • 文字列の検索アルゴリズム

    「私は世界一頭がいいので、数学なんか簡単すぎていいかげん飽きてきた。」 この文字列から「いいかげん」を検索するアルゴリズムにはどんなものがあるのでしょうか? 条件 ・100KB(5万字)程度のデータから10文字程度指定文字列を検索する。 ・100KBと元データもそれほど大きくないので、プログラムが簡単なアルゴリズムが良い。 ・そのアルゴリズムの解説がインターネット上にあること。 単純に「い」を探して合致したら次の文字も「い」であることを確認。 さらに次の文字が「か」であることを確認。 さらに・・・「げ」・・「ん」 とやっていく方法でも良いとは思うのですが、もしかしたらもっとお手軽かつ高速にできる方法があるのかなと思い質問してみました。 なければないという回答でもかまいません。 また、参考までにテキストエディタ等がどのようなアルゴリズムを用いているのか知っている方(推測できる方)はその方法についても教えて頂ければと思います。 よろしくお願いします。

  • 高速検索アルゴリズムとデータの追加・削除

    現在高速検索のアルゴリズムを考えておりますが、 そこにデータの追加・削除が絡むと、 どのようにデータをまとめればいいのでしょうか? 例えば ------------ ------------ ------------- |data1|DATA1| |data2|DATA2| |data3|DATA3| ・・・ ------------ ------------ ------------- と要素を2つ持ったデータが複数存在した場合、 dataの昇順リスト ---------------------------- |Index|各データの先頭アドレス| ---------------------------- |・ |・ |・ DATAの昇順リスト ---------------------------- |Index|各データの先頭アドレス| ---------------------------- |・ |・ |・ というそれぞれのリストを持たせれば、 dataで検索したい場合、DATAで検索したい場合、 各リストのIndex値を用いて2分探索すれば高速だと考えました。 しかしデータの追加・削除があればそれぞれのリストを その度にソートし直さなければなりません。 もちろん追加・削除の度にデータ1つ分ずつずらしてやればいいだけですが、 基本的に使わない領域は解放したいですから、データ数の上限値が決まってない以上は 領域も確保されているとは限らないですから安易にデータをずらすことも出来ません。 データのずらしかたもどうでしょう? リストに加えるor削除する箇所からその時の最大値までをコピーして データ1つ分のサイズをずらして貼り付けるといった動作は、 連続した処理や排他的処理を考えると好ましくないのでしょうか? もし根本的に高速検索と追加・削除の相性が良い手法があればご教授願います。

  • 学習のアルゴリズム

    次のようなケースで、学習させるうまいアルゴリズムをご存知の方はいっらしゃらないでしょうか? (1)基本のパターンは数万個あります。各パターンには番号が振ってあります。 (2)数百個のパターンの集合と、その中で「最も良い」パターンの番号のデータが数百万個あります。ただし、この「最も良い」の評価は人間の感性のような、結構いいかげんな物だと考えてください。 (3)このようなデータを学習させ、各パターンになんらかの方法で点数を与える。 このようにして出来た学習データを使い、(2)と同じデータを再度与え、「最も良い」パターンが最も点数の高いパターンに一致する確立をなるべく高くしたい。 (2)と同じデータではないが、同様のデータを与え、最も点数の高いパターンが、「同じ感性」で「最も良い」とされる確率ができるだけ高くなるようにしたい: このような学習を行うアルゴリズムについて、なにか良い論文、本などをご存知でしたら御教えください。

  • アルゴリズムのご相談2

    度々すいません。 また考え方の課題なんですけど、 各配列のDataの中に順不同なバラバラなデータが入っているときに、 その中から最も0に近いIndexでDataが空白になっている箇所を探すには、 どういった検索方法が高速なのでしょうか? この場合、頭から探すしかないのでしょうか? ---------------- | Index | Data ---------------- | 0 | 123 ---------------- | 1 | abc ---------------- | 2 | xyz ---------------- | 3 | ← ---------------- | 4 | 456 ---------------- | 5 | ---------------- | 6 | ABC ---------------- | 7 | XYZ ---------------- | 8 | 789 ---------------- | 9 | ijk ---------------- | … | …

  • アルゴリズムでわからない問題があります。(C言語)

    問題1:探索アルゴリズムであるハッシュ法について正しいものを選べ。 (1)ハッシュ関数の出力によりデータを格納した配列の先頭から順番に調べる. (2) 入力データを,ハッシュ関数の出力により求めた格納場所に基づいて,あらかじめ木構造に格納しておく. (4) 入力データを格納した配列を繰り返し2つに分割し,それぞれを順番に調べていく. (3) 入力データから格納場所の位置に変換する関数(ハッシュ関数)の出力により,データの探索場所を決定する。 (5) 入力データを,ハッシュ関数の出力により求めた格納場所に基づいて,あらかじめヒープに格納しておく 問題2:探索アルゴリズムであるハッシュ法について正しくないものを選べ。 (1)入力データはハッシュ値で決められる場所に格納される. (2) ハッシュ関数には,異なる入力の値に対し異なる値を出力することが求められる. (3) ハッシュ関数の時間計算量は,入力データのサイズに比例する. (4) データの格納場所が大きい方が効率がよい. (5) 一般に2分探索法より高速に動作する. どなたかアルゴリズムに詳しい方回答お願いします

  • なぜRDBの検索は遅い?

    個人的な印象ですが、RDBベースの検索システム、データ抽出システムはグーグルやヤフーの検索サービスに比べて異様に遅い気がします。 検索条件(検索語句)や検索対象はグーグル、ヤフーの方が遥かに複雑で広大なように見えるのに、なぜこのような差があるのでしょうか?(グーグルがrobotで予めデータ集めてるとか、キャッシュサーバがあるとかこうりしても差が開きすぎな気がします) アルゴリズムレベルでRDBの方が検索に向いていない感じがするのですが、ご存知の方、教えてくださいますようお願いします。

  • インデックスのアルゴリズムとBツリー

    主キーじゃないカラムにインデックスを張るとき、 つまり、値が重複することがありうる場合に 利用されるBツリーは通常のBツリーと比較して、 どのように変更すればよいものでしょうか。 また、WHERE句内で * などを使用して検索するとき、 どのようにBツリー内を検索すれば効率的でしょうか。 データベースの実装に関する質問になりますが、 わかる方、よろしくお願いします。

  • データを抽出して更新するアルゴリズムについて

    基本情報の勉強をすこしかじっているのですが、ソートや検索といったものの基本的なアルゴリズムはならったのですが、いまいち応用が出来ません。例えば、エクセルなどで、値の書き換えの必要となるあるデータの集まりを抽出し、一度必要な更新(データの置換)を行ったものはもう更新の対象としない、あるいは、元のデータの群れに戻すというような場合、どのような処理手順を書くのが理想的でしょうか?

  • 大滝みや子先生の「アルゴリズム解法」で

    大滝みや子先生の 基本情報技術者 「かんたんアルゴリズム解法」流れ図と擬似言語で ページ49 第2章 基本例題 第1部アルゴリズムと流れ図 5 1次元配列へのデータ格納 の 表2で、 umaxnの要素"4"と"5" 及び statusの要素"空き"が ○(まる)で囲まれている理由が、解りません。 ご存知の方、教えて下さい。 宜しくお願いします。

  • アルゴリズムのご相談

    はじめまして DHCPのような動作をするアルゴリズムを考えている最中なのですが… その案の中でどうしてもクリア出来ない課題があります。 「配列で作られたテーブルにユーザ名の一覧があり、 そのユーザ名をキーワードとして配列のインデックスを抽出したい」 というもので、これだけなら簡単なのですが、以下3つの条件の提示により、無理ではないかと思えて仕方がないです。 ・ユーザ名は何らかのルールに則って作られた文字列ではない。 ・キーワードを頭から順に比較して探していく方法を使ってはいけない。 ・ユーザの追加・削除がある度にソートし直さなければならないような構造にしてはいけない。 2分探索法などの検索回数を減らす方法はソートされてることが前提条件ですし、 ユーザ名から配列のインデックスに使える数値に変換できるような都合のいい関数なんて存在しないように思えるのですが、いかがでしょう? ちなみに開発言語はCです。