keinoblog's blog

ながおけいのブログ

プロコンへの道のり

プロコン勉強一日目。

今日はまずは「プロコンてどんな知識、力が必要なの?」のあたりをつけるために、こちらの本を手にとってみた。

 

http://ecx.images-amazon.com/images/I/41bHxtpurqL._SX386_BO1,204,203,200_.jpg

 

本曰く、

プログラミングコンテストは、次の2つの要素の複合競技だと言えます。
■ 効率的で正しいアルゴリズムを考える
■ それを正しく実装する

そして、アルゴリズムを考えるためには
■ 柔軟な発想力
■ 基礎的なアルゴリズムの知識

が必要になります

とのこと。

 

つまりは、
■ 問題を「よりスマートに」解くための「手順」を考え
■ コンピュータに「手順を伝えるためのプログラム」を書く
ことが求められていそうだが、

「手順の正しさを決めるものは何か?」
「手順のスマートさを決めるものは何か?」
「コンピュータて、どうお話(手順をお伝え)すればいいの?(ざっくり)」

がそもそも分からないので知る必要がある。

 

ざっと本の目次を眺めてみたところ、「全探索」「貪欲法」「動的計画法」など書かれており、これらが「定番アルゴリズム」として存在してるぽい。(違うかもしれない)
そして「データ構造」というものもあり、どうやら「データの集まりをコンピュータの中で効果的に扱うため、一定の形式に系統立てて格納するときの形式」のことらしい。(Wiki参照)コンピュータとしてもデータの記憶の仕方がいくつかあり、何か手順を伝える際は、どの形式でデータを記憶頂くのが良いか、こちらが指定する必要があるみたい。(違うかもしれない)

 

感覚的に、定番アルゴリズム等は覚えておくべきだが、より本質的なのは「データ構造」といった概念をはじめ、コンピュータとお話しする際に知っておくべきルール、仕組みになりそう。そして恐らくこれらは「コンピュータサイエンス」という学問体系に内包されている。(違うかもしれない)

問題は「コンピュータサイエンス」のどの部分をどこまで勉強する必要あるか、、だがこれは専門家に聞いてみることにしよう。

 

おわり。

 

※補足:コンピュータサイエンスの体系について
(Peter Novig「プログラミングを独習するには10年かかる」参照)

コンピュータサイエンス:情報と計算の理論的基礎、及びそのコンピュータ上への実装と応用に関する研究分野

・ 計算理論系
  ・ 離散構造/数学的基礎
  ・ 計算理論
  ・ 数値解析
・ 計算実装系
  ・ アルゴリズムとデータ構造
  ・ プログラミング言語と方法論
  ・ 分散コンピューティング
  ・ オペレーティングシステム
  ・ コンピュータ/アーキテクチャ
  ・ コンピュータネットワーク通信プロトコル
  ・ コンピュータグラフィックス
・ その他
  ・ インフォマティクス