- 締切済み
アルゴリズムの勉強法は慣れしかないのでしょうか?
pipipi523の回答
- pipipi523
- ベストアンサー率40% (148/365)
この問題で重要なのはマージソートの考え方とその実現方法です。たぶん。 まずソートの考え方を理解する必要がありますが、 図を見ても解りにくいので実際に値の変化を見ながら追っていくのが理解し易いでしょう しかし人の作ったプログラムを解析しているだけでは理解し難いので、 実際に入力して動かして見るのが良いと思います(動かしたり改造してたりすると理解度が違います) 例えばPerlで入力・・ 実際にやってみました (確認に使ったツール) http://www.forest.impress.co.jp/article/2001/09/03/perlwohajimeyou.html @input=(47,33,68,55,74,89,25,10);#入力 $size=@input; #問題 $span_size=2; @output=@input; while($span_size<=$size){ $span_idx=0; $write_idx=0; $ordered = 'true';#α while($span_idx<$size){ $a_idx=$span_idx; $b_idx=$span_idx + $span_size/2; #for($i = $a_idx-$span_idx ; $i < $b_idx ; $i+=1){ for($i = 0 ; $i < $b_idx ; $i+=1){ $temp[$i]=$output[$i + $span_idx]; } $a_yet='true'; $b_yet='true'; while($a_yet eq 'true' || $b_yet eq 'true'){ if($b_yet eq 'false' || ($a_yet eq 'true' && $b_yet eq 'true' && $temp[$a_idx - $span_idx] <= $output[$b_idx])){ $output[$write_idx] = $temp[$a_idx - $span_idx]; $a_idx = $a_idx + 1; if($a_idx >= $span_idx + $span_size/2){ $a_yet = 'false'; } }else{ $output[$write_idx] = $output[$b_idx]; $b_idx = $b_idx + 1; if($b_idx >= $span_idx + $span_size){ $b_yet = 'false'; } } if($write_idx>0){#β if($temp[$write_idx]>$output[$wtite_idx]){ $ordered='false'; } } $write_idx = $write_idx + 1; } $span_idx = $span_idx + $span_size; } #γ if($ordered eq 'true'){ $span_size=$size; } $span_size = $span_size * 2; } #問題ここまで print "END = ".join(',',@output)."\n";#結果確認 i: a_idx - span_idx , i < b_idx - a_idx , 1 は、直前で、 a_idx ← span_idx と、なっているので0にしかならないですね i: 0 , i < b_idx - a_idx , 1 と同等です どっちでも正しく動くので間違いではないですが・・・ミスでしょう。
関連するQ&A
- ++idxと[idx+1]の違い
どちらでも可ではないのでしょうか??? (1)++idxの場合はインクリメントされた値で処理 (2)[idx+1]の場合は+1をした値で処理 (3)idx++の場合はもとのidxの値で処理してからインクリメント 最初のトレースは0から始まるから(1)(2)では処理をするidxの値は1、(3)では処理をするidxの値は0、その後1。 理解が違いますか? http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H17a2/pm10.html の設問1 教えてください
- ベストアンサー
- C・C++・C#
- アルゴリズムの正当性について
線形探索法のアルゴリズムの擬似コードを書いて、そのアルゴリズムの正当性をループ不変式を用いて証明するという課題があります。 擬似コードは以下のような流れにしようと思いますが、この場合成り立つループ不変はどのようなことになりますか? 配列A[a1..an]に対してv=A[i]ならば添字iを、vがAの中になければNILを出力するアルゴリズムです。 for i ←1 to N if A[i] = v return i return NIL
- ベストアンサー
- 数学・算数
- CASLII(基本情報)の過去問がわかりません!
現在、基本情報技術者試験突破のため、CASLIIの過去問を解いているのですが、理解できなくて困ってます。 平成13年春期の問8です。 http://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H13a2/pm08.html 特に6行目のシフト演算命令以降が何をしてるのかがさっぱりです。。。 教えて頂けると嬉しいです・・・ お願いします!!
- 締切済み
- その他([技術者向] コンピューター)
- 基本情報について
このサイトの問4の3設問ができなくて困っています。わかるかたご教授よろしくお願いします。 http://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H11a2/pm03.html
- ベストアンサー
- その他([技術者向] コンピューター)
- 多項式P(x)=an・x^n+an-1・x^n-1+…+a1・x+a0
基本情報処理の過去問題 平成7年度 春期 第二種 午後 問2がわかりません P(x)=an・x^n+an-1・x^n-1+…+a1・x+a0 anとxをつなぐ「・」が何を意味するものなのかもわかりません 解説を下さる方お願いします http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H7a2/g01.html
- ベストアンサー
- 数学・算数
- 疑似言語で表現されたアルゴリズムについて…
次の疑似言語で表現されたアルゴリズムを処理の概要の条件を満たしかたについて教えてください。 途中までは求められるのですが、(1)~(5)を教えてください。- (処理の概要) 配列Aには学生番号、配列Bには成績が格納されている。同じ添字の位置に対応する学生番号と成績が格納されている。配列の大きさは10件分である。成績の良い順(降順)に学生番号、成績とも並べ替える。 (配列のイメージ(例)) 添字 配列A 配列B 配列A 配列B 1 1001 50 1004 100 2 1002 75 1002 75 3 1003 25 1005 70 4 1004 100 1001 50 5 1005 70 1003 25 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ (擬似言語) ・i←1 (1) ■i<n | ・j←i+1 | ■j≦n | | ↑ (2) | | |・w1←A(j) | | | (3) | | |・A(j)←A(i) | | | (4) | | |・A(i)←w1 | | | (5) | | ↓ | | ・j←j+1 | ■ | ・i←i+1 ■
- 締切済み
- その他([技術者向] コンピューター)
- アルゴリズム攻略法
こんにちは。 19日に基本情報を受験予定です。午後対策でゆきずまり、投稿させていただきます。 大滝みやこ先生の「アルゴリズム解法」をひととおり学習しました。 最初は頭が痛く、同じaという変数が、あるときは要素番号を示す添え字であったり「カウンタ」であったり、文脈から判断するのは短時間では無理だという思いを抱き、さじを投げましたが、学習過程で思考力の訓練になっていることを実感し、正直はまりかけています。 ただ、試験では、設問の条項と、擬似言語の記述を直感的に結びつけ、選択肢を空欄にあてはめて全体理解を深めてゆく、というのがポイントのようにも思いました。つまり、アルゴリズムは、「最初か理解を目指していたら時間が足りない」か、試験ではそこまでのレベルは求めていない、混沌とした記述から、必要な情報を拾い集め、設題に必要な回答をいかに早く判断できるか、というふうに思えました。 独学なので独りよがりの判断かもしれませんが、アルゴリズムについての考え方をお聞かせいただければと思います。 ちなみに、午前の模擬試験は、平均75%で「やや不安」なレベル。 とくに、情報とセキュリティがまったくりかいできていません」 「暗号化」だとか「ISO」だとか、、あのへんは暗記でしょうかね、、。
- ベストアンサー
- 情報処理技術者
- アルゴリズムの学習方法
次回の試験で基本情報の試験を受けたいと思っています。 すでに、ネットワーク、オラクル、簿記、JAVAなどの資格は持っているので、それに関する午前の対策は必要ありませんでした。 しかし、アルゴリズムや、擬似言語の問題が頭に入ってきません。 具体的には、流れ図を見ても何をしているのかわからないので、答えを見て流れをなんとなく理解しているといった具合です。 まだ慣れていないという事もあるとは思いますが、何をしていけばよいのかわかりません。 過去の質問にも実際にプログラムを作らないと理解できないという事が書いてあるのですが、これはアルゴリズムの問題が ほとんどできていない時期に作るべきものなのでしょうか?(最終的には作る予定ではあります) そこで質問なのですが、 1、順番的にはどのようにこなしていくべきでしょうか? ・アルゴリズムの定石を覚える(交換法などの基礎を整理 数日) ・アルゴリズムの問題を解く(試験問題を解く 1週間) ・CASLで実際にプログラムを作成(文法を覚え簡単なプログラムを作成 2週間) 上記の流れでいくつもりなのですが、これがベストの流れでしょうか? CASLを先にやっておくべきなのかぁとも思っています・・・ 2、午後のアルゴリズム問題はすべて具体的な数値を入れてトレースをして解くのでしょうか? 若しくは頭の中で道筋を立てるだけで、紙に書くようなトレースはしないのでしょうか? アドバイスよろしくお願いします。
- ベストアンサー
- 情報処理技術者