• 締切済み

二分探索の平均探索回数

こんにちは、 二分探索の最大探索回数が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に近づいていきます。 考え方の間違っている箇所の指摘をお願いします。

みんなの回答

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.5

私は情報処理技術者試験の参考書で,二分探索の平均探索回数は(log2N ではなく)[log2N] だと勉強しました。[ ] はガウス記号と呼ばれ,その数を越えない最大の整数を表します。また,最大探索回数はこれに1を足した値 [log2N]+1 で,どちらも整数値で求めることになります。 Nが15の時は,[log2(15)] = [3.906…] なので, 平均探索3回(Miyabiさん計算 3.266),最大探索4回 Nが16の時は,[log2(16)] = [4] なので, 平均探索4回(Miyabiさん計算 3.375),最大探索5回 ……となって,最大探索回数は正しく求められています。その反面,要素数が1つ増えただけで平均探索回数が一気に1回分増える境界があるわけですから,整数で求めた平均探索回数の値にはアバウトさが見られると思います。

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

いろいろ調べたところ、以下のようなページが見つかりました。 Average Case of Binary Search http://www.mcs.sdsmt.edu/ecorwin/cs251/binavg/binavg.htm Dividing by n to get the average gives A=k + k/n -1 Notice that for large n, this is about k–1. Thus, the average case is only about one step better than the worst case. どうも途中でよくわからなくなってしまったのですが、 具体的な値を当てはめて考えるとかえってわかりづらくなってしまう のかもしれません。

Miyabi_
質問者

補足

いくつかページを紹介して下さり、ありがとうございます。 私なら検索で引っかかっても英文を見た時点で中身に目を通さなかったと思います。 翻訳した時点で、意味が判らず、 数式を見て、一旦は判った気になったけど、また判らず…。 とにかく、 高校数学で極限を求める時のように、 具体的な数値で考えずに証明した方が上手くいくかもしれない事は判りました。 捕まえれたら数学の先生に聞いてみたいと思います。

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

はじめにお断りしておきますが、わたしは数学に関しては不得意なほうですので、 見当はずれのことを言っている可能性があります。 正確を期すならその方面の識者にあたるなりしてください。 んで、質問者さんが実際の数値として平均回数を求めようとして 色々計算していらっしゃいますが、なんとなくですが、単純に 算術平均(相加平均)を使っては目指す数字が出ないのではないかという 気がします。 質問に対する回答(2) http://www004.upp.so-net.ne.jp/s_honma/question/question2.htm 面倒くさいので相乗平均使ったらどうかとかは確かめていません。 あと、ぶっちゃけ 全部を探索しつくすのに必要な回数が log2(N) + 1 なのですから、(少なくとも)半分を探索しつくすのに必要な回数 = 平均探索回数は最大探索回数のひとつ前、つまり log2(N) になるという考え方では納得できませんか? それに小数点以下の部分は切り上げて考えるべきことがほとんどでしょうから、 log2(N)-1 <= x <= log2(N) の範囲になっているのならあまり気にすることもないんじゃないかと。 たとえば平均値として6.5回という数字が出たとして、0.5という数字そのものには 切り上げて全体を7にするという役目以外に意味を見出せません。

Miyabi_
質問者

補足

相乗平均はこの場面で使うのが妥当かどうなのかも判りませんが、 平均を取る値が2つ3つではないので、具体的に試すこともできないです…。 > 全部を探索しつくすのに必要な回数が log2(N) + 1 > なのですから、(少なくとも)半分を探索しつくすのに必要な回数 > = 平均探索回数は最大探索回数のひとつ前、つまり log2(N) 本に書いてある『平均探索回数の場合、N/2個のデータ探索をすればよいと考えます』 という意味が判りました。 具体的な数値を調べる以前なら、 「最大探索回数が7回の時、7回で見つかるのが全検索結果の約半分を占めてて、1~5回で見つかる時は少ないから 平均すれば6回前後になるのかなぁ」とおぼろげに納得したのでしょうが、 具体的な数値を出したり、Nを増やすとほぼlog2N-1になるのを見てる現状では、う~ん…、といった所でしょうか。 明らかに"-1"が出てくると - - - - ちなみに今までの質問・補足で参考にしてる書籍は基本情報技術者の対策本、 「3週間完全マスター 基本情報技術者 2004~2005年度版」で 別の「2001年度版 基本情報技術者 標準教科書」を見た所、"比較回数"については A:線形探索の平均比較回数 n/2 B:線形探索の最大比較回数 n C:二分探索の平均比較回数 [log2n] D:二分探索の最大比較回数 [log2n]+1 * [ ] はガウス記号で[ ]内の値を超えない最大の整数を表す と書かれています。 また、要素数が10,100,1000,10000の時のそれぞれの回数も書かれていますので10000だけを挙げてみると A:5000 B:10000 C:13 D:14 とあります。 その次の節では計算量の話が述べてあり、各探索の"計算量"では a:線形探索の計算量 n b:二分探索の計算量 log2n nの個数が10000の場合は a:13.3 b:10000 とあります。 確かに、二分探索の最大比較回数は最大で何回調べるのか、なので 7.5などと小数点が付いてはいけないから小数点以下の処理をしなければなりません。 で、この場合は小数点以下を切り捨てるのが正しいので上の[ ]の記述は正しいと思います。 では、平均比較回数の方は小数点以下を切り捨てなければいけないのでしょうか。 また、計算量の所では13.3と小数点以下を切り捨てていません。 たいていの本では線形探索の平均探索回数はN/2とありますが 別の本で、(1+n)/2となっていたのを見て、「厳密に書いてあるなぁ」と思ったのですが、 その本の二分探索の平均探索回数はlog2Nになってますね…。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.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回 この場合だと、8個から15個までは最大検索回数が4回に収まりますよね。 そのなかで8個というのは最小のものですから、 > (3+2+3+1+3+2+3+4)/8 > と計算し、2.625と考えました。 としてしまうと、ひとつ下のレベルの数値、log2(N)-1に近づいていってしまうというわけです。 ためしにデータ数を15、31、63といった数字で計算してみてください。 > 書籍では『平均探索回数の場合、N/2個のデータ探索をすればよいと考えます』と書かれていますが > どういう意味なのか判りません。 たとえば線形探索だと、 運がよければ最初の要素で当たりを引けますが、最悪だと最後の要素になります。 大体何回検索すると当たりを引けるかというのがN/2になるという理屈はいいですか(単なる算術平均です)? 二分検索の場合は、 1回で当たり→1個 2回で当たり→+ 2個 3回で当たり→+ 4個 4回で当たり→+ 8個 ... のように個数が増えますが考え方は同じで、半分調べつくすのに必要な回数を考えれば、 全体での平均の回数がわかるというわけです。

Miyabi_
質問者

補足

> ひとつ下のレベルの数値、log2(N)-1に近づいていってしまうというわけです。 私も当初、Nを一つずつ増やして調べた値はlog2Nのグラフに対して振動しているだろうと思って細かく調べていきました。 Nが7の時は、 (3+2+3+1+3+2+3)/7 = 2.428…、と計算しました。 > ためしにデータ数を15、31、63といった数字で計算してみてください。 上のNが7個の様に調べると、(左が実際に調べてみた値/右がlogを計算した値) 15コ:3.266… / log2(15) = 3.906… 31コ:4.161… / log2(31) = 4.954… 63コ:5.095… / log2(63) = 5.977… 127コ:6.055… / log2(127) = 6.988… 255コ:7.031… / log2(255) = 7.994… 511コ:8.017… / log2(511) = 8.997… 1023コ:9.009… / log2(1023) = 9.998… 2047コ:10.005… / log2(2047) = 10.999… と、最大探索回数が同じ中で最大のNを挙げても傾向が変わりません。 Nを2のn乗ずつではなく、一つずつ増やしていってもlog2N-1に近づいていくように見えます。 > 大体何回検索すると当たりを引けるかというのがN/2になるという理屈はいいですか(単なる算術平均です)? 線形探索の場合、最大探索回数がN、平均探索回数がN/2になるのは理解できます。 > 二分検索の場合は、 に書かれているような値を計算しています。 Nが15の時、 1回で当たりが1個 2回で当たりが2個 3回で当たりが4個 4回で当たりが8個 を( 1*1 + 2*2 + 3*4 + 4*8 )/15 = 3.266 と求めているのですが…。 - - - - 平均探索回数という意味がそれぞれの探索回数を合計し要素数で割るという受け取り方が間違っているのか、 もしくは具体的な探索方法が違ってる気がしてるのですが、どうでしょう…。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

Nが十分大きければN+1→Nとみなせるので、log2(N)と言ってるのでは。 計算量を考えるときは、たいてい定数項は無視しますので。 >『平均探索回数の場合、N/2個のデータ探索をすればよいと考えます』 こっちは、ソートされてないデータについての検索の話では。

Miyabi_
質問者

補足

引用が大きくなりますが… 『二分探索では~… 略(最大探索回数をmとすると N*(1/2)^(m-1)=1 → m=log2N+1 になる、という説明) ~…つまり、最大N個のデータを探索するのに、最大でlog2N+1回、 平均でlog2N回探索すればよいことになります(平均探索回数の場合、N/2個のデータ探索をすればよいと考えます)。 従って、二分探索の計算量はO(log2N)となります。』 とあります。 > Nが十分大きければN+1→Nとみなせるので、log2(N)と言ってるのでは。 書籍にも「O記法(オーダー記法)ではnの係数やnに加減される定数は無視」と書かれているので 最後の行の計算量がlog2Nというのは理解できます。 その一つ前の行の『平均でlog2N回』というのが腑に落ちなかったのですが、これもO記法の意味合いで書かれているのでしょうか…。 ただその後ろの括弧書きの意味が判らないのには変わりありません。 > こっちは、ソートされてないデータについての検索の話では。 文章の頭に二分探索ではとあるので、多分ソートされている前提で語られていると思うのですが。

関連するQ&A

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

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

  • 探索問題

    n個のデータがあり,その中から与えられたキー を持つデータを探索するとき,最大計算時間の下界が Ω(log n)であることを証明したいのですが,どうしても わかりません.どのようにしたらよいかどなたか教えて 下さい.よろしくお願いします.

  • 基本情報技術者での質問です。

    問題 500個の要素をもつ配列を線形探索するとき、探索キーと配列中の要素との平均比較回数をAとする。 また、昇順に整列された500個の要素をもつ配列を2分探索するとき、探索キーと配列中の要素との平均比較回数をBとする。 このとき、AはBの約何倍か。ここで、探索キーと一致する要素が、配列中に必ず存在するものとする。 答えは31倍なんですが。 自分の解釈としては、まず線形探索の最大比較回数=n この場合だと500です。 この場合2分探索の最大比較回数=(log2N+1回) を割れば何倍かがでてくるであっていますか?? それとバカな質問ですいません高校のときにlogをならっておらず いまさら数学の先生がいなく理解にくるしんでいます。 (logとこの自分が考えてる解き方であっているか)回答おねがいします。

  • 基本情報技術者での質問です。

    問題 500個の要素をもつ配列を線形探索するとき、探索キーと配列中の要素との平均比較回数をAとする。 また、昇順に整列された500個の要素をもつ配列を2分探索するとき、探索キーと配列中の要素との平均比較回数をBとする。 このとき、AはBの約何倍か。ここで、探索キーと一致する要素が、配列中に必ず存在するものとする。 答えは31倍なんですが。 自分の解釈としては、まず線形探索の最大比較回数=n この場合だと500です。 この場合2分探索の最大比較回数=(log2N+1回) を割れば何倍かがでてくるであっていますか?? それとバカな質問ですいません高校のときにlogをならっておらず いまさら数学の先生がいなく理解にくるしんでいます。 (logとこの自分が考えてる解き方であっているか)回答おねがいします

  • 2文探索法の平均回数

    平均比較回数でいきなりlogとかでてきますが、なぜでしょうか?平均といえば2で割るしかわからない私には理解不能です。どうぞお教えください

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

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

  • アルゴリズムを勉強していたのですが、線形探索をする

    アルゴリズムを勉強していたのですが、線形探索をする時にデータ件数がNの時平均比較回数が(N+1)÷2回となっていたのですが、なぜ+1をしているのでしょうか?普通にN÷2ではダメなんでしょうか 解説お願いします

  • パチンコの平均継続回数の計算方法はa%の継続率だとすると1/(1-a)

    パチンコの平均継続回数の計算方法はa%の継続率だとすると1/(1-a)ですが、これは感覚的にも数学的にも理解できます。 ですが、他の方法で、例えば数列をもちいて数学的に計算することはできますか? 自分が思ったのは1回の継続の時の期待値は1×a、2回の継続の時は2×a×a、3回の継続の時は3×a×a×a、…と計算していきn回継続までの期待値の合計を求め、nを無限まで飛ばせばそれが平均継続回数だと感じました。でも実際計算してみると∞×0がでてしまい解を持たなくなります… この方法ではだめみたいなのですがこれはいったい何をもとめてしまっているのでしょうか…?

  • 確率を求める母数に平均を使ってもいいですか。

    サイコロAをふってもいい回数をサイコロBで決めるとします。 まず、 サイコロBは10回ふれることが決まっています。 そうすると、サイコロAは全部で平均して35回ふれるメドになります。これは平均であって、サイコロAをふってもいい回数のトータルは、最小10回から最大60回までになります。 問題として、 「サイコロAで1が10回以上出る確率はいくらか?」 ということを考えます。 ところで、二項定理というのがありますね。 それを使うとPの確率のことをn回やると成功するのがa回である場合の確率が求まります。 これをサイコロAに適用して、P=1/6として、nは平均の35を採用して、先ほどの問題を解いたら、正しい答えになるでしょうか。 サイコロをふる回数をnとしてふれる見込みの平均をnとして使ってもいいかどうかをお聞きしたいです。

  • 情報処理で出てくる「log」とは

    情報処理で出てくる「log」がよくわかりません。 どういう意味でしょうか? 【例1】   logaM=n 【例2】   blogaM 【例3】   データ探索で出てくる探索回数のlog 解説を見ても、計算方法等の詳しい説明や、logの説明がないため、 よくわかりません。 初心者でもわかりやすいように、教えていただけないでしょうか。 お願いします。     

専門家に質問してみよう