• ベストアンサー

アルゴリズムのご相談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 ---------------- | … | …

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

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

レコードのData部分を、空白にするときや非空白にする際に、プログラムに何も情報を憶えさせていないというなら、頭から調べるのが一番早いと思いますね。 どういう動作を想定しているのかわからないのでなんとも言えませんが、たとえば、   ・非空白のDataをレコードに登録するときは、必ず、空白であるDataのレコードで一番小さいインデクスものから埋めていく。   ・空白のDataを持つレコードに関しては、一番小さいインデクスしか調べない。 などの条件があるなら、非空白のDataをレコードに登録する際や、空白のDataをレコードに登録する際に、   ・「インデクスの変数(startとしますと)を一つ持っておき、start未満のインデクスには、空白のDataを持つレコードがない」ようにしておく(空白のDataを持つインデクスを探す場合は、startから調べればよい)。 とか、   ・ヒープ構造で空白のインデクスを管理しておく。    http://www.codereading.com/algo_and_ds/ds/heap.html とか、できますけどね^^

uya_15
質問者

お礼

ヒープ構造体?? ちょっと調べてみます。 ありがとうございます。

その他の回答 (1)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

登録の時に、何の情報も付加しないなら頭から検索する以外にないですね。 また、空いている領域は、必ず0に近いほうでないとだめな理由はなんですか。ただ、「どこでも良いから空いているところを素早く探せばよい」といのでは、いけませんか。 登録時の条件、削除時の条件についてもっと、具体的に、なにをなさりたいのかを提示していただけると、もっと具体的なアドバイスが、得られるかと思います。 最も速く、空きエリアを検索したいと言うことであれば、空きエリアを管理するキューを作成するのが、最も良いと考えます。

uya_15
質問者

お礼

なるほど、キューという考え方も良いかもしれませんね。 ありがとうございます

関連するQ&A

  • アルゴリズムのご相談

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

  • 検索アルゴリズム

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

  • アルゴリズムについて

    大学の授業の課題のアルゴリズムについてなのですが、内容的に頭がついて行けず、一切分かりません。問題内容は、最小値を求めるアルゴリズム(必要な箇所を修正して下さい)です。 どなたか詳しい方いらっしゃいますでしょうか? よろしくお願いいたします。 M = -9999 データX入力 while X ≠ 9999 Y M < X N   M = X   データX入力   Mを出力

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

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

  • 検索条件について

    サーバ上にある以下のようにLOAD DATAでデータベースに登録し LOAD DATA INFILE "/home/abc/test001.csv" INTO TABLE test FIELDS TERMINATED BY ','; ENCLOSED BY '"'; 登録することはできたのですが個々テーブル毎では検索できますが 複数のテーブルで検索するとうまく検索できません。 【個々のテーブルは問題なし】 select * from abc where xyz=12345; select * from 123 where xyz=12345; これですと問題なく検索がヒットします。 【複数のテーブルで検索するとうまくいかない】 select * from abc,123 where abc.xyz=123.xyz; これですと検索してもヒットしません。 ちなみにabcのxyzにある項目を「'」で括ると検索できませんでした。 データは"1","12345"でセットしています。 LOAD DATAのやり方が悪いのでしょうか? どなたか教えていただけませんでしょうか。

  • 日付順にテキストを開いて書き込むエクセルマクロ

    あるフォルダの中に「abc#1xyz_201308.txt」という形のテキストファイルがあり、 ボタンを押すと、直近1年分のファイルに対して中身のデータをシート3に書き込むような マクロを作りたいのですが、直近1年分のものに対して所定の操作を行うやり方が分かりません 例として、「C:\Users\Owner\Documents」に「abc#1xyz_201308.txt」の形のファイルが 1年以上分ある場合で教えていただけますか? (テキストは日付以外は同じ名前、つまりabc#1xyz_201307.txtやabc#1xyz_201306.txtが存在し それ以外の名前のものはこのフォルダにはありません。またフォルダ内には順番通り入っていませんが シートに書き込むのは古いものから順にしたいです)

  • タグ指定しないでタグのId取得する関数をNNでも動かしたい

    javaScriptを触り始めてまだ1週間の初心者です。 どうぞ熟練者の皆様、お知恵を貸して下さい。 「色々な種類のタグに指定されたIdから指定範囲("ABC"or"XYZ" + 000~999 の任意6文字)に当てはまるIdをHTMLファイルの前から順に取得し、それを配列にセットする」と言った関数を作りたいと思っています。 とりあえずIEではdocument.allを使用してそれらしく動いているのですが、これをNN環境でも動かしたいのです。NNで動くようにするにはどこに手を加えたら良いのでしょうか?それとも関数の作り自体変えるべきなのでしょうか? 良い解決策がありましたらお願いいたします。 該当部↓ var gArrayId = new Array(); function getSpanIDInfo() {  var intMaxNo = 0;  var intIndex = 0;  //配列宣言のため、まずは総数を調べる。  for ( var item in document.all ) {   // IDに"ABC"、"XYZ"を含むタグを見つける   if((item.indexOf("ABC") != -1) || (item.indexOf("XYZ") != -1)) {    intMaxNo = intMaxNo + 1;   }  }  //カウント終了したらその数でID情報配列作成  gArrayId = Array(intMaxNo - 1);  //作成した配列にIDを保存  for ( var item in document.all ) {   // "ABC"、"XYZ"を含むタグを見つける   if((item.indexOf("ABC") != -1) || (item.indexOf("XYZ") != -1)) {    // 見つけた順に保存    gArrayId[intIndex] = item.substring(0,7);    intIndex = intIndex + 1;   }  }  return intMaxNo; }

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • 番号順に配列するには?

    番号順に配列するには? A列に飛び飛びに番号が入力されていて、 その隣にデータがあります。 それをA列の番号順に、飛んでいる番号は空白にして 番号と一緒にデータを配列するにはどうしたらいいでしょうか??

  • CSV出力について

    長文お許しください。   Do Until EOF(1)     Line Input #1, aa     bb = Split(aa, ",")       :       :   aaの値は 1234,abc   ,ABC  です。   これを   1234,xyz   ,ABC  に編集し出力したく   以下のコードを書きました dim x01 dim x02 dim x03    x01 = bb(0)   bb(1) = "xyz   "   x02 = bb(1)   x03 = bb(2)   Write 1, x01, x02, x03 出力の内容を見ると、   "1234","xyz   ","abc" になります。 これをダブルコーテーションなしで   1234,xyz   ,abc に出力したいのです。 根本的なコードの書き方が間違っているかも知れませんが どのようにすればよろしいかアドバイスお願いします。 ※LINE INPUTを使用しているのは、入力データ 2項目の abcの後ろの空白を参照するためです。 開発はVB6です。

専門家に質問してみよう