- ベストアンサー
2分探索法 『成功・不成功探索一回の実行時間を求める』
- 2分探索法による成功探索と不成功探索の実行時間を求めるプログラムを作成しました。しかし、実行時間にずれがあり、正しい値が分かりません。
- 成功探索の場合、実行時間はNの値に対して増加する傾向にありますが、ずれがあるため一番適切な値が分かりません。
- 不成功探索の場合、実行時間が成功探索よりも短くなっており、正しい値が得られません。また、Nと実行時間の関係についても分からないため、ヒントを求めています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ざっとプログラム見ましたが、特に問題は無いように見受けられます そもそも探索ですから(N=16として) 1回目で見つかる場合もあるし、最悪4回目で見つかる、みつからないとなりますよね?(2分探索なので) ですので平均を計算する必要があります するとだいたい、o LOG nで検索できるとなります ちなみに不成功探索ですがv=Nだと1回目の探索ですぐ「ないぞ」とわかってしまうのでだめです a[i] = i*2; とでもしておいて(データはすべて偶数) v = N/2; ならいいんじゃないですか?
その他の回答 (2)
- gau_puzzler
- ベストアンサー率48% (39/81)
確認しますが、実行環境はなんですか? linux?、windows? さらに開発環境はどうですか? gcc?、visualC?
お礼
色々、ありがとうございます 一応、問題は解決しました… 中途半端な形になって申し訳ないのですがここで締め切らせて頂きます。スイマセン。
- gau_puzzler
- ベストアンサー率48% (39/81)
>質問なんですが、v=Nの場合なぜ一回目の探索で「ない」と分かってしまうのでしょうか? >常に「r > a[i]」なので、l=m+1をしていってr>lの時終了するので最大回数まで行くと思ったのですが・・・ あ!、そうですね勘違いしてました たしかに最大回数いきます (ついでにV=N/2+1でした) それでなんですが、10^8だと探索回数は27回なので たかだた27のループの実行速度はあっというまに終わってしまうので 誤差の範囲内なのでだめでしょう ちゃんと計測するのなら以下のように 時間測定開始 10000回ループ 検索する部分 時間測定終了 とやって、測定値を10000で割ったらどうでしょうか?
お礼
時間測定開始 1000000回ループ 検索する部分 時間測定終了 (double)(t2-t1)*1000000/(CLOCKS_PER_SEC*T) ↑として、一応やっています…(先生から同じようなことを言われてループして、そのループした回数を割って平均を出しました) 友達に聞いたら、不成功探索時間は成功探索より短くて良いと言われたんですが・・・ なぜ短くなってしまうのかが分かりません。
お礼
早速の返答ありがとうございます。とても参考になりました。 確かに、何回も繰り返して、1回目で終了することが多ければ時間は短くなり、逆に最大回数で終了するのが多ければ時間は多くかかってしまいますね。 あれほど差がでるものなのかな?と思っていましたが、納得しました。 不成功探索ですが、色々試してやって見たのですがやはり上手く行きません。 データを偶数にしてvに奇数を入れてやってみましたが同じような値が出てしまいます。 質問なんですが、v=Nの場合なぜ一回目の探索で「ない」と分かってしまうのでしょうか? 常に「r > a[i]」なので、l=m+1をしていってr>lの時終了するので最大回数まで行くと思ったのですが・・・