LoginSignup
0
0

アルゴリズム事始め

Last updated at Posted at 2024-01-31

AtCoderに取り組んで、行き詰ってアルゴリズムを学習し始めた人のチラシの裏です。

[読んでる本]
アルゴリズムとデータ構造

アルゴリズムを考える時の基本方針

「困難は分割せよ」
全体の解決方法を考えるのではなく、まずは手近な小さい値で検討を始めるのが良い。

よく使うアルゴリズム

全探索

頭から順に探索して特定する。いわゆるforで解いていく。

二分探索

ソート済みの配列を、以上・以下などの条件で半分に割って、探索範囲を半減させて特定する。forにif-elseが組み合わさったやつ。

動的計画法

課題の部分を解く処理を作って、それを繰り返す。
この時、処理を表す表を作って、順番に表を埋めて、目的の値を探索する。

動的計画法を理解するための補助

①再帰
メソッド内で自分を呼び出すアレ。結果を出すために実施した処理の中で、さらに同じ処理を実施する。
問題を小さくして部分をメソッド内で作るイメージ。部分を繰り返すことで全体を解く。
無限ループできるので、終了条件は明確に。

②再帰+メモ化
再帰で課題を解こうとすると、往々にして「同じ条件を繰り返し処理している」問題にぶち当たる。
ので、既に処理した条件はメモしていって、メモに書いてあるものはやらない、という考え方。
よくやる。

⇒これらを踏まえて、動的計画法はメモするモノが条件から結果に変わる。
 表を作って、順繰り埋めていくイメージ。

※以下がイメージ湧きやすくて良きでした。
https://www.momoyama-usagi.com/entry/info-algo-dp#i-2

課題を解く時の考え方のコツ

初心者は、いきなり「全探索が最適だ」とか「動的計画法が最適だ」とか、出てこない。

あるかないかだけを考える

素直に頭から順に眺めて、条件に合ったかどうかで判断する。
ゴリ押しも案外使えるのだ。

選んだ時と選ばなかったときを考える

選んだ時に条件に当てはまるか
当てはまる:選んだ時に条件に当てはまるか繰り返す。
当てはまらない:選ばなかった時に条件に当てはまるかを見て同じように繰り返す。
まずは、全体じゃなくて、問題の一部を解いていく。
処理を繰り返して、最終的に全体を解くような流れ。

境界の右(true)か左(false)かを考える

線分のどこに境界を設けるかで無限にtrue/false領域として扱えるようになる。
二分探索の応用みたいなイメージ。

できたものはメモしていく

メモ化して、確認が終わったところはスキップさせるたり、条件を埋めていったり、とにかく保持しておく。
新人研修でメモ取らされるのも伊達じゃない。

感想

プログラムなので当たり前と言えば当たり前なのだが、最終的にYes/Noの話に絶対に落ちる。なので、条件として何に当てはまるか、当てはまらないかということを考えるのが大事っぽい。
と言いつつ、今のところ、見た問題に対して何を中心に考えるべきなのかすぐ迷子になる。無理。
あと、小難しいアルゴリズムになると再帰が深く関わるけど、かといって再帰に踊らされてもいけない。私は今踊らされている。なんもわからん。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0