電子書籍の厳選無料作品が豊富!

競技プログラミングを初めてまだ間もなく、現在アルゴリズムの勉強を本を購入してやっています。基本の基本、ソート辺りまでは良かったのですが、現在「木」(二分木など)に入り、躓きました。
 AOJを主軸としてプログラムの練習をC++で行っているのですが、難易度が上がるにつれ、考えても分からず、他の方の解答例を見ても「こんなコード思いつかない!」「見ても理解に時間がかかる!」というものばかりです。
 やはり才能というものもあると思うのですが、勉強の仕方としてはどのような方法が良いのでしょうか。今私が取り組んでいるような問題にどんどんチャレンジしていく、というやり方も経験を積むという面では一つの道だと思うのですが、「分からない!」ということがここまで多くなると正しいのか分からなくなってしまって...。
 抽象的な質問になってしまいましたが、回答いただけると幸いです。

A 回答 (3件)

こんばんは。



私は、C++は今のところ扱いませんが、アルゴリズムを多少は勉強しました。アルゴリズムというものは、言語に依存性がありません。私の知る範囲では、一部はコンピュータのない時代から考え出されたものもあり、その考えた人は天才的な数学者だったりしますから、到底、私などには歯が立つとは思えません。プログラミングとしては、よく使うものは、テンプレートやスニペットにしてしまいます。

私は、手順全体は丸暗記しておいて、何度も使っている間に、完全に理解することを期待するしかないと思っています。どういう問題に、どのアルゴリズムを使うかさえ分かれば、それ以上は、競技としては別かもしれませんが、私は困らないと思います。

そもそも、アルゴリズムは、問題を解くための解法の論理や手順ですから、そういう問題に当たらなければ、まったく意味のないことだと思います。あくまでも、解を求めるものだと思います。実際に、問題に対処する場合、どんな方法でも可能なのですが、その時に、2分探索木が使えるとひらめく事自体が重要だと思います。ふつうでは、思いつかないからです。
    • good
    • 1
この回答へのお礼

アルゴリズムを知識として身に着けて置き、使い方は自分次第!問題の種類に対して、どのアルゴリズムが当てはまるか、というのを把握しておくべきですね。
回答ありがとうございました。

お礼日時:2018/02/28 19:45

日常的な行動のアルゴリズム例



START:
 就寝中
 目覚まし時計をセットした時間が来た
   目覚まし時計が鳴る
    ・起きる→ENDに進む
    ・起きない
 STARTに戻る
END:

上記の例では、目覚まし時計が鳴っても起きなかった場合には、
ずっと眠りっぱなしの無限ループに入ってしまう。
これを、実際の行動に合わせる為に
・目覚ましが鳴る前/後に起きる
・一旦起きたが、また寝る
・寝過ごした
・遅刻になるが出かける
・風邪をひいた事にして休む
・目覚まし時計を止めなければ、一定時間後に再度鳴る(最大◯回)
・目覚まし時計をセットし忘れた

等々の条件を増やしていって、どこまでいけるか。
もしくは、無駄の少ないアルゴリズムを作れるかを試行錯誤
してみる。
    • good
    • 0
この回答へのお礼

日常をアルゴリズムとしてとらえ、考える(実装する)ことが重要!ですね。確かに、ソートとか木とかにとらわれないで、普段から慣れ親しむことが一番かもしれません。
回答ありがとうございました。

お礼日時:2018/02/27 22:45

書籍に載っているようなソートや「木」(二分木など)のようなアルゴリズムは、


必要になったら書籍を見るか、前に他のプログラムで作ったのを流用する事が
多いので、こんな処理をする為のコードが有る程度に考えるぐらいでも大抵の
場合には支障は有りません。
アルゴリズムの勉強という点では、普段の日常的な行動をアルゴリズム化して
みる方が役に立つと思います。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!