プロコンへの道のり
プロコン勉強一日目。
今日はまずは「プロコンてどんな知識、力が必要なの?」のあたりをつけるために、こちらの本を手にとってみた。
本曰く、
プログラミングコンテストは、次の2つの要素の複合競技だと言えます。
■ 効率的で正しいアルゴリズムを考える
■ それを正しく実装するそして、アルゴリズムを考えるためには
■ 柔軟な発想力
■ 基礎的なアルゴリズムの知識が必要になります
とのこと。
つまりは、
■ 問題を「よりスマートに」解くための「手順」を考え
■ コンピュータに「手順を伝えるためのプログラム」を書く
ことが求められていそうだが、
「手順の正しさを決めるものは何か?」
「手順のスマートさを決めるものは何か?」
「コンピュータて、どうお話(手順をお伝え)すればいいの?(ざっくり)」
がそもそも分からないので知る必要がある。
ざっと本の目次を眺めてみたところ、「全探索」「貪欲法」「動的計画法」など書かれており、これらが「定番アルゴリズム」として存在してるぽい。(違うかもしれない)
そして「データ構造」というものもあり、どうやら「データの集まりをコンピュータの中で効果的に扱うため、一定の形式に系統立てて格納するときの形式」のことらしい。(Wiki参照)コンピュータとしてもデータの記憶の仕方がいくつかあり、何か手順を伝える際は、どの形式でデータを記憶頂くのが良いか、こちらが指定する必要があるみたい。(違うかもしれない)
感覚的に、定番アルゴリズム等は覚えておくべきだが、より本質的なのは「データ構造」といった概念をはじめ、コンピュータとお話しする際に知っておくべきルール、仕組みになりそう。そして恐らくこれらは「コンピュータサイエンス」という学問体系に内包されている。(違うかもしれない)
問題は「コンピュータサイエンス」のどの部分をどこまで勉強する必要あるか、、だがこれは専門家に聞いてみることにしよう。
おわり。
※補足:コンピュータサイエンスの体系について
(Peter Novig「プログラミングを独習するには10年かかる」参照)
コンピュータサイエンス:情報と計算の理論的基礎、及びそのコンピュータ上への実装と応用に関する研究分野
・ 計算理論系
・ 離散構造/数学的基礎
・ 計算理論
・ 数値解析
・ 計算実装系
・ アルゴリズムとデータ構造
・ プログラミング言語と方法論
・ 分散コンピューティング
・ オペレーティングシステム
・ コンピュータ/アーキテクチャ
・ コンピュータネットワーク通信プロトコル
・ コンピュータグラフィックス
・ その他
・ インフォマティクス