B試験サンプル問題   問13   について

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
カニサさん  
(No.1)
自分なりに引数をア~エまでサンプルを作りトレースしてみました

target:8
ア:data[8]
イ:data[8,9]
ウ:data[4,8]
エ:data[-1,0,8]

としてトレースしてみましたら、正解のウとエもループしてしまいますがなぜエはループしないのか教えてもらえますか?
エの2回目のwhile文以降、変数low:2、high:3、midlle:2でループしてしまいます
サンプルの作り方が違うのでしょうか?

ちなみに橋本先生の参考書の引数と変数のサンプルはdata[-1,5,0]/target:5   
となっております
たしかにこのサンプルで当てはめるとループはしませんが問題文に
「data は昇順に整列されており,値に重複はない。」と記されているので
サンプル自体が昇順になっていないため違っているように思うえるのですが・・・
2023.10.03 21:50
まーぼさん 
FE シルバーマイスター
(No.2)
サンプル問題 [科目B]問13
https://www.fe-siken.com/s/kakomon/sample/b13.html

>としてトレースしてみましたら、正解のウとエもループしてしまいますがなぜエはループしないのか教えてもらえますか?

提示された例だとエもループします。しかしそのループの原因は配列に-1が含まれていることではありません。

>ちなみに橋本先生の参考書の引数と変数のサンプルはdata[-1,5,0]/target:5   
となっております
>たしかにこのサンプルで当てはめるとループはしませんが問題文に
>「data は昇順に整列されており,値に重複はない。」と記されているので
>サンプル自体が昇順になっていないため違っているように思うえるのですが・・・

参考書を持っていないので詳しくは分かりませんが…同じ問題の解説で昇順に並べられていない配列で考えているのは誤りだと思います。
2023.10.03 22:38
電タックさん 
FE ブロンズマイスター
(No.3)
2分探索で最も見つからない場合に2つの要素まで絞られることがあります。
その際に、2つに絞られた場合に見つけたい物が”後”にある場合ループしてしまいます。
※今回のプログラムの不具合によりループします。

これはmiddleの算出結果がx.5という結果になって2つの要素の前を指すからです。
並んだ数字の足し算=偶数+奇数=奇数。奇数÷2=x.5
例:要素3と4のどっちかだった場合、3+4=7÷2=3.5=要素3(前)
※イ:data[8,9]が回らない理由は、見つけたい値が2つの要素の”前”にたまたまあったからです。

>「data は昇順に整列されており,値に重複はない。」
2分探索のアルゴリズムでランダム整列はそもそも探索不能になります。
今回は奇跡的に見つかったのでしょう。
2023.10.03 23:11
boyonboyonさん 
FE シルバーマイスター
(No.4)
この問題は、必ず無限ループになってしまうものを探します。
targetの値や要素数によって、ループになったりならなかったりするものは、解答になりません。
スレ主様の例のように、エはループになることもありますが、ならないこともあります。
解説にもあるように、アも同様です。
ウは、targetの値によらず、常に無限ループになります。

余談ですが、
不具合は、ループの中でLowやhighを設定するところです。
data[middle]<targetの場合、data[middle]は対象外なので、次はdata[middle+1]から調べれば十分です。
なので、low←middle+1にします。
data[middle]>targetの場合、data[middle]は対象外なので、次はdata[middle-1]まで調べれば十分です。
なので、high←middle-1にします。
こうすれば、ウの場合2回目のループでは、Low=2となり
Low=2,high=2,middle=2なのでdata[middle]=data[2]=targetとなり   return   2
2023.10.05 00:06

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。

その他のスレッド


Pagetop