アルゴリズムを勉強したい

受付中

回答 7

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 2,356

wego

score 10

近いうちに、企業の面接課題としてアルゴリズムの問題が出されることになりました。

そこで、アルゴリズムを勉強するのにおすすめのサイトor書籍があれば教えてほしいです。
もちろん付け焼刃でどうこうなるようなものではないと分かってはいますが、
面接までにできる限りのことは対策しておきたいのです。

できれば、いろんなパターンのアルゴリズムが網羅的にまとめられているものが理想です。
また、そういった課題面接で出されるような問題のイメージが湧くようなものや、
実際に面接を受けた方がいらっしゃれば、どういったものが出題されるのか教えてもらいたいです。

よろしくお願いいたします。

-追記-

みなさん、たくさんの回答、ほんとにありがとうございます!すごく迷ったのですが、どれも甲乙つけがたい回答ばかりで、私ではベストアンサーを決めかねるので、少し期間を置いて、もっとも高評価が多い方の回答をベストアンサーにしたいと思います!繰り返しですが、本当にありがとうございます!

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • wego

    2015/10/20 03:16

    すごく参考になりそうな本など教えて頂いてありがとうございます!ただ、面接は約1週間後に迫っているため、残念ながら、あまりじっくり本を読む時間がありません。いちおう、プログラミングはかじっているので、いろんなアルゴリズムとそれに対応するサンプルコードがまとまっているようなものがベストです!
    教えてくださったpaizaやってみました!おもしろいですね!似たようなのだとcodeIQのようなものもありますが、こちらもオススメでしょうか?

    キャンセル

  • wego

    2015/10/20 03:18

    あと、当方、あまり英語が得意ではなく、できれば日本語のサイトだとうれしいです。いろいろと条件を後付けしてしまって申し訳ありません!

    キャンセル

  • wego

    2015/10/20 21:36

    みなさん、たくさんの回答、ほんとにありがとうございます!すごく迷ったのですが、どれも甲乙つけがたい回答ばかりで、私ではベストアンサーを決めかねるので、少し期間を置いて、もっとも高評価が多い方の回答をベストアンサーにしたいと思います!繰り返しですが、本当にありがとうございます!

    キャンセル

回答 7

+6

古典を2つあげておきます。
java, ruby, python などで実際に実装しながら読むとよいとおもいます。

- The Art of Computer Programming Volume 1 Fundamental Algorithms Third Edition 日本語版  http://www.amazon.co.jp/gp/product/4048694022/

- アルゴリズムとデータ構造 http://www.amazon.co.jp/dp/4764901625/

追記:
... 面接課題としてアルゴリズムの問題 ...
この場合は、
http://rosettacode.org/wiki/Category:Programming_Tasks
にあるような小さな課題を自分で実装してみたり、コード例を読むとよいかもしれません。
(FizzBuzz 問題や、ソートなども列挙されています)

再追記:
- Tエンジニアなら知っておきたい、今更聞けないアルゴリズムの種類一覧 http://paiza.hatenablog.com/entry/2015/10/19/IT%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AA%E3%82%89%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%80%81%E4%BB%8A%E6%9B%B4%E8%81%9E%E3%81%91%E3%81%AA%E3%81%84%E3%82%A2


投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

Pythonですが、下記のサイトはボリュームがあって読みごたえがあります。

Algorithms with Python - M.Hiroi's Home Page
http://www.geocities.jp/m_hiroi/light/#python_algo

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

どのアルゴリズムを出題されるのか分からないので何とも言えませんが、初めてアルゴリズムを学ぶのであれば、「数学ガール 乱択アルゴリズム」を推奨します。
理解し易い擬似コードも書かれているので。

本格的に学ぶのであればやはり「アルゴリズムとデータ構造」ですね。
こちらはC言語を用います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

あくまでも、出題される問題を推測したうえで、ヤマをはる的なことですが、
フローチャートを頭にたたきこんでおくことがよいかと思います。

おそらく、以下のどちらかの出題かと存じます
・文章で仕様が書かれた内容をフローチャートにしなさい
・このフローチャートをプログラムコーディングしなさい

ならば、フローチャートを理解しておくだけで対応が取れます。

アルゴリズムは原則
・逐次処理
・判断処理
・ループ処理
の3種類しかありません。

この3つのアルゴリズムをフローチャートで書けるようにする、フローチャートが読めるようにするということならば1週間でも十分頭に叩き込むことができるかと思います。

あくまでも推測ですが、たとえば
「入力された文字が、"a","b","c","d","e"と一致するならば画面に一致を表示し、一致しない場合は、再入力を求めるメッセージを表示するフローを記述せよ」

というような問題が出されたとしたら
・配列テーブルを使用するのであれば、ループ式による文字一致判断
・if文のみで文字一致を判断するのであれば、if else の連続

というようなアルゴリズムが考えられます。


■以下のサイトがフローが条件別に描かれていてわかりやすかったです。
http://wwwpat.eng.u-toyama.ac.jp/flowchart/fc_sct.html

参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/20 16:14

    とても具体的かつ絞り込んだ解答ありがとうございます!!フローチャート勉強します!これくらいの対応なら私でも残りの期間でできそうです!逆に、もっと高度な問題が出題されたら、どちらにせよ、今の私には不釣り合いだったということで諦めるしかありません

    キャンセル

  • 2015/10/20 17:07

    事前にどのような問題が出題されるかを知らされるということは、あえて知らないこと(問題点)に対して、人に聞く、本で調べる、ネットで調べるなど自ら行動を起こし、課題を解決できるかどうかを試験されているのかもしれません。

    本当の仕事であれば、「わからないので出来ません。」と答えた時点で無能のレッテルを張られます。しかし、わからなくても自力で模索してなんとかできるひとならば、かなり優秀な人だと思います。

    少なくとも、課題に対してあきらめず、必死にもがく事は大事だと思います。

    キャンセル

  • 2015/10/20 21:25

    おっしゃる通りですね!ありがとうございます!試験まで諦めずにできる限りのことはやりたいと思います!

    キャンセル

+1

ちょっと期待に添える物とは違うかも知れませんが、問題を解決するためにアルゴリズムを使って実際にコードを書く!という練習をするのであれば競技プログラミングはいかがでしょうか?

競技プログラミングとは、出された問題に対して、いかに早く正確に解決するコードを書くかを競い合う競技です。各サイトで定期的にコンテストが開催されるのですが、過去問が公開されており、答案を書いて、チェックして貰うことが可能です。問題文としては次のような特徴があります。

1. 日常的な文章で物語を踏まえた問題文が多いです。たとえば「テラ君は遠足のおやつを買いに来ました。食いしん坊のテラ君はなるべくボリュームが多いものをたくさん食べたいのですが、同じ物ばかりだと飽きてしまうので、同じ物は最大3個までにすることにしました。さて、おやつは300円以内と歴史上決まっています。体積の合計が一番多くなるにはどのおかしをいくつ買えばいいでしょうか?」といった感じです。動的計画法を使えとか、メモ化再帰を使えとか問題文には出てきません。自分でどのアルゴリズムを使うのか、どのように実装するのかを考える必要があります。

2. コードの実行には時間とメモリが制限されています。一個一個順番に試していったら時間切れになるようにできています。問題文の作者が想定しているアルゴリズム(またはそれ以上高速になるアルゴリズム)でなければ解けません。

他の特徴として、他の人が書いた解答が閲覧できます。自分の解答を見比べて、何がおかしいのか、どういう工夫をすればいいのかがわかります。また、解説を載せているサイトもあります。

こうして、競技プログラミングを通して、文章を読み解く能力と実際にアルゴリズム使う能力の両方が鍛えられます。競技プログラミングを新人教育の課題としてさせている企業もあるようです。ただ、トップレベルの人たちは人間を辞めていると言われていますので、のめり込むのはほどほどにするのがいいかと思います。

いくつか(私見を交えて)紹介しておきます。

yukicoder
個人がやっている競技プログラミングのサイトです。問題文も解説もボランティアですが、トップレベルの人たちが作っていたりします。難易度が★でわかりやすくできており、★1であれば未経験者が1ヶ月ぐらいで解けるようになるぐらいです。★5や★6とかは人間を辞めている人達用ですので、気にしてはいけません。想定解のアルゴリズムがタグにあるような気もしますが、それぐらい緩いサイトです。ニコニコ生放送でコンテストをしているので覗いてみてもいいかもです。

AtCorder
AtCoder株式会社が開催している競技プログラミングです。動画で詳しい解説もしており、本格的にプロの方から学べると思います。各コンテンスは易しい問題から始まり、難しくなっていきます。1問目のA問題を解くだけでもそれなりに力がつくようになると思います。

AIZU ONLINE JUDGE
会津大学が開催している競技プログラミングです。英語っぽいサイトですが、問題文には日本語版が用意されています。(あまり使ったことが無いからよく知らない)

paiza
競技プログラミングでは無く転職支援サイトなのですが、同じように問題を出してそれを解くと言うことができます。スキルアップのためのコンテンツも用意されているようです。(こちらもあまり使ったことが無いからよく知らない)

あとは、基本英語になってしまいますが、有名どころでは
topcoder※なんか日本語のトップページもあるようですが、基本英語です。
Codeforces
とか、その他いっぱいあるらしいです(すいません、私もそれほど詳しくないです)。下の記事とかも参考にしてください。
ITエンジニアのレベルアップに最適!競技プログラミングサイト10選

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/20 21:34

    とても有益な情報を、しかもたくさん、ありがとうございます!いろいろ調べたり簡単なアルゴリズムを解いていくうちに、アルゴリズムにすごく興味が湧くようになりました!面接とか関係なく、今後も継続して勉強していきたいです!

    キャンセル

0

アルゴリズムの絵本
英語は苦手、プログラミングはまだ始めたばかりのところから一週間でとなればこれですかね。

しかし大丈夫でしょうか、面接でアルゴリズムを使う口頭試問ということは、求人側が求めているのはかじっただけの素人でない熟練開発者です。
当然、育成する気なんかありません。
もし採用されたとして配属後に求められるスキルとのギャップで相当苦しいことになりませんか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/20 14:30

    なるほど!確かにそうかもしれません。ちなみに、アルゴリズムの課題は口頭試問ではなく、一定の時間を与えられ、アルゴリズム問題をプログラミングで解くといったものです。言葉が足らず、申し訳ありません!

    キャンセル

  • 2015/10/20 14:33

    私の現在の知識レベルとしては「アルゴリズムをはじめよう」という本を読了し、探索やソートなどの超基本的なアルゴリズムはなんとなく理解できているレベルです。

    キャンセル

  • 2015/10/20 21:39

    基本情報向けのアルゴリズム本を終えておられるのですね。
    そして、採用試験はCodeIQやPaizaみたいなプログラミングクエストであると。

    さらに先へ進むなら[プログラミングの宝箱 アルゴリズムとデータ構造](http://www.amazon.co.jp/dp/4797363282)この本が中級へのステップアップに手広く内容を押さえつつわかりやすい語り口でおすすめできます。

    キャンセル

  • 2015/10/20 21:43

    ご紹介した本、第10章で探索について扱っています。
    これが結構「評価される技術力」のマイルストーンになっているところがありまして、最近でもはてなブックマークで話題になったエンジニア公募問題
    http://okajima.air-nifty.com/b/2010/01/post-abc6.html
    http://tech-gym.com/2012/07/%E6%9C%AA%E5%88%86%E9%A1%9E/786.html
    どちらも探索を使って解く問題になっています。

    キャンセル

-4

デザインパターンを勉強すると良いです。
その中でも、とりわけ業務でよく使うシングルトンの説明します。

1つのオブジェクトを異なるオブジェクトで共有して使いたい時
というケースが良くあります。例えば、DBのコネクションが良い例です。

オブジェクトの生成方法は、
Class名 オブジェクト変数名 = new Class名();
という勉強をしてきたと思いますが、
これを1つのオブジェクトにしたい場合、
Class名 オブジェクト変数名 = Class名.getInstance();
という呼び出し方をして、クラスの方の設計は、
   
private static クラス名 メンバ変数名 = new クラス名();
// コンストラクタ    
private クラス名(){}
public static クラス名 getInstance(){
        return メンバ変数名;
}
という感じで、コンストラクタをprivateで宣言し、
インスタンスをクラスのメンバに持たせるというのが特徴です。
これをシングルトンと呼びます。

以上の流れからご理解いただけると幸いですが、
デザインパターンとは、どういう課題をどういう手法で解決させるか、
といったものの集合体です。
なので、デザインパターンを勉強することは、アルゴリズムを勉強する事と同じになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/20 17:38

    包括的に言えば同じくくりかと

    キャンセル

  • 2015/10/20 19:06

    定義認識に齟齬がある状態で議論を重ねても誰もが納得できる結果には至らないと思います。
    もっとも、アルゴリズムの課題面接には絶対にデザインパターンの概念・考え方が出ないと主張されるのであれば、私の回答に批判を重ねる意義はあるかとは思いますが。。。

    私の主張したい大筋(大枠といったほうが良いのかな)はKenjiObataさんの回答の通りです。課題面接の意図は、アルゴリズムという言葉を正確に知っているかって事ではなく、「どういう課題をどういう手法で解決させるか」にあるんじゃないかと予想してます。

    キャンセル

  • 2015/10/20 19:31

    定義齟齬をすりあわせ無いのであれば、意味が無いことには同意します。

    デザインパターンを身につけることと、
    アルゴリズムを身に付けることが同じと読めたので、
    それには違和感を感じましたが、大筋がKenjiObataさんの回答と同じであるならば、
    特に反論することはありません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる