• ベストアンサー

pascalでの二分探索(バイナリサーチ)

ファイルからデータを読み込み,それを整列し,入力された値をデータの中から二分探索によって探索することを繰り返すプログラムが作りたいのですが,どのように記述すればよいのか分かりません。教えてください。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

ひょっとして二分探索のアルゴリズムをPascalで どう記述するか見当がつかないとかいう話だったりしますか? program ex01(input, output); var data : array [1..20] of integer; procedure readdata(); var i, v: integer; f : text; begin (* assign(f, 'sample.txt');*) reset(f, 'sampledata.txt'); for i:=1 to 20 do begin readln(f, v); writeln(v); data[i] := v; end; end; procedure sortdata(); var i: integer; begin for i:=1 to 20 do begin (* 省略 *) writeln(data[i]); end; end; procedure search(v: integer); var low, high, mid: integer; begin while low < high do begin mid := (high - low) div 2 + low; (* 省略 *) end end; begin (* read data *) writeln('#####'); readdata(); (* sort *) writeln('#####'); sortdata(); (* search *) search(15); end. てな感じで組めば良いのではないですか? 検索対象の値の入力は工夫の余地ありですけど。 ファイルのオープンの手続きは処理系によって 違うようなので参考程度に。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

とりあえず、手順の各部分でどうするかはわかってますか? ・ファイルからデータを読み込む ・整列する ・二分探索によって検索を行う データの種類(文字列とか整数)や個数についての 情報はないのですか?

kachimoai
質問者

補足

整列する方法は分かっています。 データは20個の整数です。

関連するQ&A

  • 2分探索 バイナリーサーチ?

    初歩的な質問で恐縮ですが、どうぞよろしくお願いします。 2分探索 バイナリーサーチで、登録件数5000件のデータからある数値を探索する場合、平均探索回数をXとした場合 2(X:べき乗)<=5000<2(13:べき乗) となり、最大検索回数が13回、平均探索回数が12回となることなのですが??? これはどのように解法すればよいのでしょうか

  • 線形と二分探索により探索を行うプログラムについて教えてください

    20個の配列にデータを入れ(プログラム内で初期化と代入を行って良い)入力した数を探索するプログラムをCmachineで作成したいのですが、線形探索により探索を行うプログラムと二分探索により探索を行うプログラムの作り方を教えていただけないでしょうか?

  • 二分探索木を用いての探索

    C言語でプログラミングしています。 二分探索木を用いて探索するプログラムなのですが 与えられた値の前後の値(与えられた値より大きく(小さく)てその値 に一番近いもの)を見つけたいのですが分かりません。 いろいろとネット等で調べてみると「挿入してその左右を見る」 となっているのですが…。 普通の二分探索木ではだめなのでしょうか? よろしくお願いします。

  • 線形探索

    c++で線形探索をするプログラムを教えてください。 キーボードから入力した数字の中からある値があるかどうか調べるものです。

  • 探索プログラムの速さの計算方法を教えてください。

    以下が問題です。 「長さがNの系列に対して3nμ秒で探索を完了する線形プログラムと 4log_2(n)μ秒で探索を完了する二分探索プログラムと 2nlog_2(n)μ秒で整列を完了するプログラムがある。 これらのプログラムを利用して、長さが1024の未整列のデータ系列Sに対し、ある要素が含まれているかどうか探索したい。このとき以下の問いに答えよ。ここでの検索要求とは「系列Sにある要素Xが含まれているかどうか判定すること」とする。」 ・検索要求が1回、5回、10回の場合それぞれの最も速い探索方法とその時間を述べよ。 計算方法と答えを教えてください。

  • 二分探索の平均探索回数

    こんにちは、 二分探索の最大探索回数がlog2N+1なのは 書籍にある計算式の変換で理解できたのですが、平均探索回数がlog2Nなのが理解できません。 書籍では『平均探索回数の場合、N/2個のデータ探索をすればよいと考えます』と書かれていますが どういう意味なのか判りません。 そこで具体的に考えてみました。 例えば8個のデータの中から探す場合、 a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7] とデータが並んでいて、 それぞれの位置に目的の値が入っていた時の探索回数は、 3回、2回、3回、1回、3回、2回、3回、4回 と考えました。 a[1]の場所に目的の数があった場合、 2回目の探索で見つかる、という意味合いです。 最大探索回数はa[7]の時に4回となり、log2N+1になっています。 この考え方でNを増やしていった所、最大探索回数はlog2N+1になりそうです。 そこで上記の場合の平均探索回数の方は、 (3+2+3+1+3+2+3+4)/8 と計算し、2.625と考えました。 この考え方でNを増やしていくと 16コ:3.375 32コ:4.21875 64コ:5.125 128コ:6.0703125 …と、 平均探索回数がlog2Nではなくlog2N-1に近づいていきます。 考え方の間違っている箇所の指摘をお願いします。

  • 二分探索は木のように例えられる?

    二分探索は、「半分にして対象外の値を除去しながら探索する」ということですが、分かりやすい例えで言うと、木の枝が伸びるような感じで探索する感じでしょうか? 回答のほうよろしくお願いいたします。

  • 二分探索について

    今、学校の宿題で二分探索の課題が出てるのですがよくわかりません。どなたか教えていただけないでしょうか?内容は11,24,36,44,58,64,77の7つの数字の中で、58を二分探索を使って探し出すのですが、何回の比較で58を探し出したかをmsgboxを使って表示させるプログラミングを考えるというものです。よろしくお願いします。

  • バイナリサーチです

    javaプログラムで、 プログラム中に10人分の番号、氏名、電話番号を書き、 二文探索を使って、番号or氏名から電話番号を検索する というプログラムを作っています。 テキスト頼りに自分でやってきたのですが、 コンパレータなどの意味が分からず どう使えばよいか分かりません 途中まではやってみたのですが、ここまでも合ってるか分かりません 二文探索の方法についてご教授願います import java.util.Arrays*; import java.util.Scanner*; import java.util.Comparators*; class search { static class 10data { private int number; //番号 private String name; //名前 private String phonenumber; //電話番号 public 10data(int number, String name, String phonenumber) { this.number = number; this.name = name; this.phonenumber = phonenumber; } public String toString() { return number + "" + name + "" + phonenumber; } public static void main(String[] args) { Scanner stdln = new Scanner(System.in); 10data[] x = { new P_Data(01,akai,9147965416), new P_Data(02,akiyama,9274621646), new P_Data(03,katayama,5695195617), new P_Data(04,kato,8414817863), new P_Data(05,sakamoto,9548614769), new P_Data(06,sato,1819316141), new P_Data(07,tanaka,3215468548), new P_Data(08,tani,6456212314), new P_Data(09,nakanishi,6865148642), new P_Data(10,nakamura,3136467825), }; System.out.print("誰の電話番号を検索?生徒番号or名前:");

  • 二分探索で近似値

    こんばんは。 ソートされたfloatの配列で検索キーに最も近い値のインデックスを取得するにはどのようにしたらよろしいのでしょぅか。 単純に二分探索でやってみましたが正しい値が取得されない場合がありました。