• 締切済み

アルゴリズムの勉強法は慣れしかないのでしょうか?

学校の先生から、アルゴリズムは慣れだ慣れだと言われて、ひたすら問題を解くのですが、なにかしっくりきません。 時々、ここはなんでこういう事をしているのか分からないという所が出てきます。 例えば、基本情報技術者試験平成16年度春期午後のこの問題 http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H16a2/pm04.html において、擬似言語中の上から13行目の i: a_idx - span_idx , i < b_idx - a_idx , 1 では、教科書どおり?トレースしていくと a_idx - span_idx なんかは始めは0なんで、なぜ0としないでこんな事をやっているのかなあ・・・と頭を抱えてしまいます。 こうしている理由は、次々とループしていくとiの初期値は0でないときも出てくるからかな?とは想像できるのですが、 a_idx も span_idxもそれに伴って変化していくので 、なんでこんな式を使うの??? と頭がごちゃごちゃになってしまいます。 何か法則的なことがある程度はあるような気がするのですが・・・。 ごく初歩的な例で行くと、iは何の変数かといった時にプログラム中にT(i)などとあると、配列の添え字なんだなと分かる、みたいな事です。 どのようにして考えていけばいいのでしょうか? 何か法則みたいなものをご存知の方も、教えていただけないでしょうか? よろしくお願いします。

みんなの回答

回答No.3

>アルゴリズムは慣れだ慣れだと言われて、ひたすら問題を解くのですが、なにかしっくりきません 慣れはものすごく必要ですが 問題をひたすら解くだけのそんな知識役に立ちません。 実際にプログラミングをしてみないと無意味です。 それにその勉強方法でとった資格なんて資格の肩書きだけで なんの役にも立ちません。 科学の授業も黒板で説明されるよりは実験して 試した先生に言われることでなくて 自分考えてでりいろいろ試行錯誤したほうが覚えやすいでしょ?

kururi75
質問者

お礼

おっしゃるとおりで、私もそう思っています。 授業としても4月から一回もプログラム実習がなく、黒板ばっかりで、かなり無味乾燥です。 ただ、学校では、「来月10月の国家試験で通らないと、来年の就職活動に間に合わない可能性がある。 取っているのと取っていないのとでは就職率が全く異なってくる」、と発破をかけられます。 私としては、基本情報の試験のための勉強よりもJAVAの方が好きだし資格SJCシリーズの方をどんどん取っていきたいのですが(組むことを楽しみながら)、 資格じゃないと言っておきながら結局資格(この場合は基本情報)を持っている人を企業としては採用しているという現実を学校側に突きつけられると、従わざるを得ません。 現実とは、あくまでうちの学校から就職した時の現実としてはという意味です。 大学を出ればいいってもんじゃないと言っておきながら、ほとんど一流大学しか採用しない一流企業と一緒です。 もう少しPCに触れ、色々と試しながら楽しみながら学んでいく事を私としても望んでいるのですが、 時間的に厳しいものがあるのでやむを得ない感じです・・・。 また、自分でプログラムをスイスイ組んでいけるレベルまで達していませんし、コンピュータの勉強も今年4月に始めたばかりですので・・・^^;

kururi75
質問者

補足

すいません、就職率というより、就職の決まりやすさみたいな感じです。

  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.2

No1でちょっと引っかかっていたのですがβのところは間違いで、 $output[$write_idx-1]>$output[$write_idx]が正解でした。 マージソートは名前しか知らなかったので・・勉強になりました A^-^; あとは、sizeが2^2n(2,4,8,16・・)以外のときはうまく動かないのですが、 その辺りどう改造すればいいかなど考えるのが面白いと思います

kururi75
質問者

お礼

わざわざプログラムまで組んでいただいてありがとうございます!!! やっぱり実際に入力してみると良く分かるんですね。 私はJAVAを少しかじったぐらいしかプログラムをやったことがないのですが、なんとなく似通っていたので、perlも少し分かりました。 >あとは、sizeが2^2n(2,4,8,16・・)以外のときはうまく動かないのですが、 その辺りどう改造すればいいかなど考えるのが面白いと思います ほぉ~!こんな条件が裏に隠れていたとは思いもしませんでした。実際動かしてみると色々と出てくるのですね。 試験まであと一ヶ月もないぐらいなので、ちょっとプログラムを入力して理解・・・というのはきついので・・・、やはり問題の入力データの例を実際に当てはめて流れを追っていくしかないのですかね? なんとなくやっていることはわかるのですが、 データの例を当てはめてトレースしていっても それぞれの変数がどういう役割をしているのかというのが、どうもしっくりこないんです。 マージソートを知っている→試験に出る であればいいのですが、問題は色々と組み合わさったものが出て試験場で考えなくてはならないので、 なにか解く手順のようなものがあればいいのですが。 どこを見るといい、とか。 pipipi523さんなら、 http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H16a2/pm04.html の問題を出されたとしたらどう解いていかれますか?

  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.1

この問題で重要なのはマージソートの考え方とその実現方法です。たぶん。 まずソートの考え方を理解する必要がありますが、 図を見ても解りにくいので実際に値の変化を見ながら追っていくのが理解し易いでしょう しかし人の作ったプログラムを解析しているだけでは理解し難いので、 実際に入力して動かして見るのが良いと思います(動かしたり改造してたりすると理解度が違います) 例えば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  教えてください

  • アルゴリズムの正当性について

    線形探索法のアルゴリズムの擬似コードを書いて、そのアルゴリズムの正当性をループ不変式を用いて証明するという課題があります。 擬似コードは以下のような流れにしようと思いますが、この場合成り立つループ不変はどのようなことになりますか? 配列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

  • インクリメント

    情報処理の問題で一つわからない点があります http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H19a2/pm10.html 上記HPの「 d 」の答えなのですが rank++ と rank = i + 1 答えはどちらでもかまわないのではないでしょうか? インクリメントを使っての答えは間違いとなりますがどうして??? 教えてください

  • CASLの問題

    http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H11a2/pm10.html で被乗数を14ビットシフトの意味を理解できなく この問題を解けません どなたかご教授を

  • 疑似言語で表現されたアルゴリズムについて…

    次の疑似言語で表現されたアルゴリズムを処理の概要の条件を満たしかたについて教えてください。 途中までは求められるのですが、(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、午後のアルゴリズム問題はすべて具体的な数値を入れてトレースをして解くのでしょうか? 若しくは頭の中で道筋を立てるだけで、紙に書くようなトレースはしないのでしょうか? アドバイスよろしくお願いします。

専門家に質問してみよう