paiza開発日誌

paiza(http://paiza.jp)の開発者が開発の事、プログラミングネタ、エンジニアの転職などについて書いています。

初中級エンジニアが【アルゴリズムを優しく学べる】本とサイト16選

f:id:paiza:20141013182008j:plain
Photo by VFS Digital Design

皆さんはアルゴリズムやデータ構造について知っているでしょうか。情報系の学部出身の人は学校の授業でやったかもしれません。一方で学校で情報系の勉強をせずにITエンジニアになったという方は、アルゴリズムやデータ構造について一度は「勉強したほうが良いんだろうな」と思いつつも、実際の業務であんまり必要なさそうだし、難しそうだし、DevOpsやオブジェクト指向フレームワークについて学ぶので手一杯で未着手、という人も多いのではないでしょうか

今回はそんな方に向けて、アルゴリズム、データ構造を学ぶ意義と、それらを学ぶときに役立つ本とサイトについてまとめました。

アルゴリズム、データ構造を学ぶ意味

アルゴリズムやデータ構造について語られるときに、非常に良く言われる事として「そんなものは実務に役立たたないので必要ない」という意見があります。本当にアルゴリズムやデータ構造は実務に役立たないのでしょうか?

実務に役立たないのか?というと、もちろん役立たない仕事も中にはあるでしょう。パンチャーに近いコーダーであれば、仕様書に書かれている日本語をコードに落としていく事が業務範囲なのでアルゴリズムやデータ構造の理解を必要とする事は無いかもしれません

しかしそういった完全分業でない状態でプログラムを書く仕事をしているのであれば、アルゴリズム、データ構造について知っていて損な事はないでしょう。

例えばソートについてですが、通常すでにソート関数はあるので自分で再度作る必要な無いと思います。しかしソート自体がどのような種類のソートがあり、それぞれのソートアルゴリズム動作の仕組みと、それによる長所短所を知らなければ最適なソートアルゴリズムを使い分ける事は出来ません

データ構造についても、例えば配列と連結リストについて、それぞれの構造とメリットデメリットを知らなければ使い分ける事は出来ません

またこれはプログラミング全般に言える事ですが、動作の仕組みを理解していないと、問題が起きた時に動作の仕組から考えて問題の切り分けが出来ないため、解決法のあたりがつけられないという事も起きがちです。

アルゴリズムやデータ構造は丸暗記する事が重要なのではなく、仕組みを理解する事で、最適な選択ができるようになり、また問題が起きた時に対処がしやすくなります。特に高速化が必要な際などにはアルゴリズムやデータ構造の知識は必要になります。

アルゴリズムを知らずに使う事(ブラックボックスがあるという事)をビジネス的な方面で例えてみると、外注で仕事を依頼するとき、外注先がどのような体制で業務をこなしているかや、何を得意としているのかを知らなければ最適な外注先に依頼する事は出来ないし、少人数の外注に巨大な案件を依頼して炎上してしまうという事も起こってしまう、というような感じでしょうか。

自分が利用しているものの仕組みや中身を知らなければブラックボックスと化してしまい、リスクのコントロールが出来なくなってしまいます。勿論これは程度の問題なので、有限の時間の中ですべてを知る事は不可能ですが、知っておいて損はない事項と言えます。

アルゴリズムを現実世界で応用すると

アルゴリズムはプログラミングの中だけで閉じた概念ではありません。実世界で応用できる例もあります。

例えば大きなデータ読みこんで途中で処理が上手くいかないような際に、1行目からデータをチェックするのではなく、まずデータの前半に問題があるのか、後半に問題があるのかを調べ、後半に問題があるのであれば後半をまた半分に分割してみてその前半に問題があるのか後半に問題があるのか、、というように問題個所を狭めていって特定する、ということが有ると思います。このやり方はアルゴリズムで言うと二分探索(バイナリーサーチ)と言います。

遺伝的アルゴリズムでゲームの面白さを上げる、というやり方もあります。

有名なのはZyngaのやり方だ。

彼らは1000人いたら、10人ずつ100チームの小チームを作り、全員で同じゲームを並行して開発する。会員数が100万人いたら、それを100分割して1万人が実は細部の異なるゲームを遊んでいる。

その中で、性能を評価する。チーム12のゲームは継続率が高いが課金率は低い、チーム72は課金率は高いがARPU(一人当たり課金単価)は低い・・・などなど。

性能評価の結果、生き残ったチームの「作品」が、あるタイミングで100万人全プレイヤーに対して提供される。


ソーシャルゲームの向こう側: 単なるWebサービスには飽きてきた。じゃあなんだろう。|UEI shi3zの日記
http://d.hatena.ne.jp/shi3z/20111217/1324090325

このように実世界でもアルゴリズムを応用し効率を上げる事が出来たりもします。

アルゴリズム、データ構造を学ぶ時期

ある程度プログラミングに慣れて書けるようになってくると、コードを書いているときに「凄い人だったらもっと良い書き方するんだろうな」と思う瞬間があると思います。

  1. より効率の良いやり方がありそうだけど…
  2. より高速なやり方がありそうだけど…
  3. よりスマートな書き方がありそうだけど…

などなど。こういう事を考えるようになったらアルゴリズムやデータ構造について学ぶのにちょうどよい時期かもしれません。速攻で役立つTipsは少ないかもしれませんが、書き方に迷った時の引き出しが増え、また計算量や効率という判断基準が増えるので、なんとなくコードを書くのではなく、なぜそう書いたかという裏付けを持つことが出来、より良い選択が出来るようになります。

勿論可読性と計算量を天秤にかけて、場合によっては可読性を優先するという事があっても良いのですが、計算量について全く知らなければ天秤にかける事すらできません。

もっと良い書き方ないかな?と思ったり、プログラムが裏でどういう動きをしているのか知りたい、と思ったらアルゴリズムやデータ構造を学ぶのに良いタイミングだと思います。ここからは、アルゴリズムとデータ構造を学ぶのにオススメの本とサイトを紹介していきます。

■初心者にお勧めのアルゴリズムに親しむ本、サイト

まずはアルゴリズムやデータ構造に親しむための読み物系入門書と入門サイトです。具体的なアルゴリズムやデータ構造の解説等ではなく、まだアルゴリズム、データ構造に敷居が高いという方が、利用シーンのイメージを付けるために下記のサイト見たり、本を読んでみると良いかもしれません。

◆VisuAlgo

http://www.comp.nus.edu.sg/~stevenha/visualization/index.html


アルゴリズムをビジュアルで見せてくれるサイトです。概念だけだと解りにくいアルゴリズムもビジュアルで動作の様子を見ていく事で直感的に理解する事が出来るサイトです。

◆世界でもっとも強力な9のアルゴリズム

世界でもっとも強力な9のアルゴリズム

世界でもっとも強力な9のアルゴリズム

検索エンジンのインデクシング、ページランク公開鍵暗号法、誤り訂正符号、.パターン認識、データ圧縮、データベース、デジタル署名、決定不可性などの、実サービスでよく目にするアルゴリズムについて読み物としてわかりやすく書かれています。

◆人間に勝つコンピュータ将棋の作り方

人間に勝つコンピュータ将棋の作り方

人間に勝つコンピュータ将棋の作り方

コンピューター将棋のアルゴリズムの変遷と歴史について、開発者や関係者が解説をしています。アルゴリズムを知らない人でも将棋のルールを知っていれば、コンピュータ将棋でどのようにデータ構造や探索アルゴリズムが使われているか分かりやすく書かれており、親しみながら知る事が出来ます。

数学ガール 乱択アルゴリズム (数学ガールシリーズ 4)

数学ガール 乱択アルゴリズム (数学ガールシリーズ 4)

数学ガール 乱択アルゴリズム (数学ガールシリーズ 4)

確率、統計、アルゴリズムについて、魅力的な物語形式で書かれており、数学の知識がそれほどなくても式の立て方や、考え方について分かりやすく書かれています。

アルゴリズム、データ構造の入門本

アルゴリズム、データ構造について具体的に学んでみたいと思った方は下記の本を読んでみると良いでしょう。

◆珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造

珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造

珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造

試行錯誤をしながら最終的なプログラムに行きつく思考の過程が文章や擬似コードや図表で書かれており、どのようなアプローチで思考をすればよいのかがわかる本です。アルゴリズムの大切さが良くわかる本です。

アルゴリズムクイックリファレンス

アルゴリズムクイックリファレンス

アルゴリズムクイックリファレンス

アルゴリズムを学ぶ際に一番最初に読む本としては少し重めなので、最初から順番に読んでいくというよりは、興味のある箇所から読んでいく方が向きます。ただアルゴリズムの説明がかなり丁寧で初学者向きの書籍です。データ量と実行時間などの実データの比較も載っており、アルゴリズムの特性、違いを理解しやすい内容になっています。

アルゴリズム、データ構造の練習系の本、サイト

座学で学ぶだけでなく実際に手を動かして、練習して頭に定着させたい、自分のレベルを知りたいという場合は、下記のサイトや本がオススメです。

◆paiza

http://paiza.jp

プログラミングスキルチェックで出題された問題を解くとプログラミングスキルを6段階に評価してくれるサービスです。最上位のランクS、次のレベルのランクAの問題ではアルゴリズム力が試される問題が出されています。

◆POH

https://paiza.jp/poh/kirishima

とっつきやすい物語形式でアルゴリズム力が試される問題が出題されています。特にアルゴリズムを知らなくても問題自体は解け、各言語の最速実行時間ランキングなども出ており、アルゴリズム別の解答コードや解説も用意されているため、練習やアルゴリズムを学ぶ切っ掛けとして最適です。

◆AOJ

http://judge.u-aizu.ac.jp/onlinejudge/index.jsp?lang=ja

会津大学が提供しているオンラインプログラミングチャレンジのサイトです。高等学校パソコンコンクール・プログラミング部門の過去問題や、日本情報オリンピックの過去問題など100問以上の問題にチャレンジ可能です。

◆入門 データ構造とアルゴリズム

入門 データ構造とアルゴリズム

入門 データ構造とアルゴリズム

アルゴリズムとデータ構造について、説明と問題が半々ぐらいの割合で書かれており、少し重たいですが、どういうアルゴリズムか学んで問題がでての繰り返しなので独習に最適な本です。ただしサンプルコードは全てC言語で書かれているためCが分からない人は注意が必要です。
http://www.oreilly.co.jp/books/9784873116341/

アルゴリズムパズル ―プログラマのための数学パズル入門

アルゴリズムパズル ―プログラマのための数学パズル入門

アルゴリズムパズル ―プログラマのための数学パズル入門

「パズルを解くことで、アルゴリズム的思考を鍛える」というコンセプトで、150問のパズル問題が収録されています。解法はプログラミング言語ではなく、アルゴリズムを日本語で解説してあります。ハノイの塔やnクイーン問題など、採用試験等でもよく出される問題についても収録されています。

◆世界で闘うプログラミング力を鍛える150問 トップIT企業のプログラマになるための本

米国の人気企業(MicrosoftAmazonGoogleAppleFacebookYahoo!)の採用面接で出されるコーディング問題、質問についてまとめられている本です。世界のレベルを知るのに良い書籍です。

競技プログラミング系の本

アルゴリズム力を高める為に競技プログラミングに参加したい、という人向けのサイトと本です。

TopCoder

http://www.topcoder.com/

世界のツワモノがそろう競技系プログラミングサイトです。世界レベルで自分の実力を知りたい場合はこちらで腕試しをしてみると良いでしょう。

◆最強最速アルゴリズマー養成講座 プログラミング

プログラミングコンテストチャレンジブック

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

この二冊(通称チーター本とアリ本)は、TopCoder等のプログラミングコンテストに参加してみたいという方には必携の本と言えるでしょう。

■じっくり学びたい人向けの本

アルゴリズムイントロダクション 第3版 総合版 (世界標準MIT教科書)

アルゴリズムイントロダクション 第3版 総合版 (世界標準MIT教科書)

アルゴリズムイントロダクション 第3版 総合版 (世界標準MIT教科書)

  • 作者: T.コルメン,R.リベスト,C.シュタイン,C.ライザーソン,Thomas H. Cormen,Clifford Stein,Ronald L. Rivest,Charles E. Leiserson,浅野哲夫,岩野和生,梅尾博司,山下雅史,和田幸一
  • 出版社/メーカー: 近代科学社
  • 発売日: 2013/12/17
  • メディア: 大型本
  • この商品を含むブログ (5件) を見る
原著は,計算機科学の基礎分野で世界的に著名な4人の専門家がMITでの教育用に著した計算機アルゴリズム論の包括的テキスト。値段も高く、中身も重いので優しく学べる訳では有りませんが、理論的にじっくりと学びたい人にお勧めです。

まとめ

いかがだったでしょうか。アルゴリズム、データ構造の勉強は最初は敷居が高くて先延ばしにしがちなので、なるべく取っ付きやすい本、サイトから紹介をしてみました。アルゴリズム、データ構造は、最初のさわりを学ぶだけでも大分視界が開け、より深く広くプログラミングについて考えられる用になると思いますので、勉強してみる事をオススメします!




paizaではITエンジニアとしてのスキルレベル測定(9言語に対応)や、プログラミング問題による学習コンテンツ(paiza Learning)を提供(こちらは21言語に対応)しています。テストの結果によりS,A,B,C,D,Eの6段階でランクが分かります。自分のプログラミングスキルを客観的に知りたいという方は是非チャレンジしてみてください。

http://paiza.jp