アルゴリズムってどうやって解くのかわからない
ループが多いと頭がこんがらがっちゃう
こんな方に向けてトレースという方法を用いたアルゴリズムの説き方を解説します。
本記事の内容
- トレースとは?
- 実践しながら解説
トレースは慣れるまで何問か解く必要がありますが、
慣れてコツを掴めば、地道ではありますが着実に点を取れるようになります。
私も初めは全く理解できませんでしたが、コツを掴むと点数が取りやすくなり、
アルゴリズムが得意分野になりました!
トレースの概要
いきなり出てきたけどトレースってどんな方法なのか、解説していきます。
トレースの意味とは
そもそもトレース(trace)とは、直訳で「なぞる」「追跡する」という意味があります。
ITの分野では「プログラムの実行過程を追跡し調査する」という意味があるようです。
この意味のように、これから紹介するトレースの方法は、プログラムの実行過程を表に書き起こし、変数を追跡する方法です。
トレースによって何ができるようになるのか
アルゴリズム問題で多く出される問題は、
プログラムのある時点で変数の値がどうなっているかという種類の問題です。
このような問題を解くには、
処理が進むにつれてコロコロ変わっていく変数の値を正確に追跡する必要がありますが、
これが、アルゴリズムを解くうえで混乱しやすいポイントですよね。
今回紹介するトレースは、プログラムを進めながら変数を表にまとめていくため、
混乱しやすい変数の追跡を正確に行うことができます。
トレースのやり方
では実際の試験問題のプログラムをトレースしてみましょう。
出典:平成27年度秋期 基本情報技術者試験 午後 問8
※穴埋め問題のところは正解を入れています(四角で囲われたところ)
はじめにプログラムの引数となる値を確認しましょう。
設問の文を先に見て、引数になる値が書かれていないか確認します。
今回は以下の値が書かれていたので、これをプログラムに当てはめていきます。
- Text[] = ABCXBBACABACADEC
- TextLen = 16
- Pat[] = ABAC
- PatLen = 4
注意
問題のはじめの、プログラムの説明にも値が書かれていることがあります。
設問に書かれている場合は、その値による処理結果を問われるので、
設問の値を使ってください。
1つめのループ
ここの処理ではSkip[1]~[26]すべてにPatLenを代入しているだけなので、
特に表に書き起こす作業は必要ないですね。
PatLenは設問にあった引数なので、Skipはすべて4と把握しておくだけで大丈夫です。
2つめのループ
1周目I=1からスタートします。
I=1のとき、Pat[1] = A、Index(A) = 1なので、
Skip[1] = 3
1周目終わり
2周目I=2
I=2のとき、Pat[2] = B、Index(B) = 2なので、
Skip[2] = 2
2周目終わり
3周目も同様に処理すると
これでループが終了しました。
ポイント
- ループの周期で列を増やしていく
- 新しく変数の値が更新されたら行を増やす
- 値が更新されたときだけ数値を記入する
3つめのループ
トレースの前にαとβが気になりますね。
先に設問を見て、どんな問題なのか見ておきましょう。
設問を見ると、αとβがそれぞれ何回実行されたか、という問題でした。
αとβの実行回数もカウントしていきましょう。
(2つめのループのγはトレースに関係ない問題だったので無視しました)
また、今回はループが2つあります。
この解説の中で、一つ目の大きいループをループ①、
ループ①内のループをループ②とします。
はじめにPLastにPatLenが代入されていて、PLast = 4なので、
ループ①の条件が真となり、ループ①に入ります。
ループ②の前までいくと
Text[PText] = X
Pat[PPat] = C
ループ②の条件は偽なのでとばす
2周目
Text[PText] = X
Pat[PPat] = C
ループ②の条件が真なので、ループ②に入る
PPat = 1ではないので、とばす
ループ②を3周期まで進めると
Text[PText] = B
Pat[PPat] = A
となるためループ②の4周期目には入らず抜ける
ループ①の3周期目も同様に進めると
ループ②の4周期目で
Text[PText] = A
Pat[PPat] = A
となり、PText = 9を返してプログラムが完了しました。
まとめ
長々とやってきましたが、ポイントは以下の通りです。
ポイント
- 引数は設問の値を使う(設問になければ問題文)
- 設問を先に読み、処理の実行回数をカウントする
- ループの周期ごとに列を増やしていく
- 新しい変数が出てきたら行を増やす
- 値が更新された時だけ記入する
アルゴリズムは慣れるまでがとても難しい分野だと思います。
トレースは時間がかかりますが着実な方法です。
トレースを使っていくつか問題を解いてみて、自分なりのコツをつかんでください!