近いうちに、企業の面接課題としてアルゴリズムの問題が出されることになりました。
そこで、アルゴリズムを勉強するのにおすすめのサイトor書籍があれば教えてほしいです。
もちろん付け焼刃でどうこうなるようなものではないと分かってはいますが、
面接までにできる限りのことは対策しておきたいのです。
できれば、いろんなパターンのアルゴリズムが網羅的にまとめられているものが理想です。
また、そういった課題面接で出されるような問題のイメージが湧くようなものや、
実際に面接を受けた方がいらっしゃれば、どういったものが出題されるのか教えてもらいたいです。
よろしくお願いいたします。
-追記-
みなさん、たくさんの回答、ほんとにありがとうございます!すごく迷ったのですが、どれも甲乙つけがたい回答ばかりで、私ではベストアンサーを決めかねるので、少し期間を置いて、もっとも高評価が多い方の回答をベストアンサーにしたいと思います!繰り返しですが、本当にありがとうございます!
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/19 17:50
2015/10/19 17:52
2015/10/19 18:13
2015/10/19 18:16
2015/10/19 18:18
2015/10/20 12:36
回答7件
0
古典を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 問題や、ソートなども列挙されています)
再追記:
投稿2015/10/19 13:47
編集2015/10/19 15:17総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ちょっと期待に添える物とは違うかも知れませんが、問題を解決するためにアルゴリズムを使って実際にコードを書く!という練習をするのであれば競技プログラミングはいかがでしょうか?
競技プログラミングとは、出された問題に対して、いかに早く正確に解決するコードを書くかを競い合う競技です。各サイトで定期的にコンテストが開催されるのですが、過去問が公開されており、答案を書いて、チェックして貰うことが可能です。問題文としては次のような特徴があります。
-
日常的な文章で物語を踏まえた問題文が多いです。たとえば「テラ君は遠足のおやつを買いに来ました。食いしん坊のテラ君はなるべくボリュームが多いものをたくさん食べたいのですが、同じ物ばかりだと飽きてしまうので、同じ物は最大3個までにすることにしました。さて、おやつは300円以内と歴史上決まっています。体積の合計が一番多くなるにはどのおかしをいくつ買えばいいでしょうか?」といった感じです。動的計画法を使えとか、メモ化再帰を使えとか問題文には出てきません。自分でどのアルゴリズムを使うのか、どのように実装するのかを考える必要があります。
-
コードの実行には時間とメモリが制限されています。一個一個順番に試していったら時間切れになるようにできています。問題文の作者が想定しているアルゴリズム(またはそれ以上高速になるアルゴリズム)でなければ解けません。
他の特徴として、他の人が書いた解答が閲覧できます。自分の解答を見比べて、何がおかしいのか、どういう工夫をすればいいのかがわかります。また、解説を載せているサイトもあります。
こうして、競技プログラミングを通して、文章を読み解く能力と実際にアルゴリズム使う能力の両方が鍛えられます。競技プログラミングを新人教育の課題としてさせている企業もあるようです。ただ、トップレベルの人たちは人間を辞めていると言われていますので、のめり込むのはほどほどにするのがいいかと思います。
いくつか(私見を交えて)紹介しておきます。
yukicoder
個人がやっている競技プログラミングのサイトです。問題文も解説もボランティアですが、トップレベルの人たちが作っていたりします。難易度が★でわかりやすくできており、★1であれば未経験者が1ヶ月ぐらいで解けるようになるぐらいです。★5や★6とかは人間を辞めている人達用ですので、気にしてはいけません。想定解のアルゴリズムがタグにあるような気もしますが、それぐらい緩いサイトです。ニコニコ生放送でコンテストをしているので覗いてみてもいいかもです。
AtCorder
AtCoder株式会社が開催している競技プログラミングです。動画で詳しい解説もしており、本格的にプロの方から学べると思います。各コンテンスは易しい問題から始まり、難しくなっていきます。1問目のA問題を解くだけでもそれなりに力がつくようになると思います。
AIZU ONLINE JUDGE
会津大学が開催している競技プログラミングです。英語っぽいサイトですが、問題文には日本語版が用意されています。(あまり使ったことが無いからよく知らない)
paiza
競技プログラミングでは無く転職支援サイトなのですが、同じように問題を出してそれを解くと言うことができます。スキルアップのためのコンテンツも用意されているようです。(こちらもあまり使ったことが無いからよく知らない)
あとは、基本英語になってしまいますが、有名どころでは
topcoder※なんか日本語のトップページもあるようですが、基本英語です。
Codeforces
とか、その他いっぱいあるらしいです(すいません、私もそれほど詳しくないです)。下の記事とかも参考にしてください。
ITエンジニアのレベルアップに最適!競技プログラミングサイト10選
投稿2015/10/20 10:48
総合スコア21733
0
あくまでも、出題される問題を推測したうえで、ヤマをはる的なことですが、
フローチャートを頭にたたきこんでおくことがよいかと思います。
おそらく、以下のどちらかの出題かと存じます
・文章で仕様が書かれた内容をフローチャートにしなさい
・このフローチャートをプログラムコーディングしなさい
ならば、フローチャートを理解しておくだけで対応が取れます。
アルゴリズムは原則
・逐次処理
・判断処理
・ループ処理
の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 05:59
総合スコア440
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/20 07:14
2015/10/20 08:07
2015/10/20 12:25
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/20 05:30
2015/10/20 05:33
2015/10/20 12:39
2015/10/20 12:43
0
どのアルゴリズムを出題されるのか分からないので何とも言えませんが、初めてアルゴリズムを学ぶのであれば、「数学ガール 乱択アルゴリズム」を推奨します。
理解し易い擬似コードも書かれているので。
本格的に学ぶのであればやはり「アルゴリズムとデータ構造」ですね。
こちらはC言語を用います。
投稿2015/10/19 15:19
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Pythonですが、下記のサイトはボリュームがあって読みごたえがあります。
Algorithms with Python - M.Hiroi's Home Page
http://www.geocities.jp/m_hiroi/light/#python_algo
投稿2015/10/19 14:33
総合スコア9388
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
デザインパターンを勉強すると良いです。
その中でも、とりわけ業務でよく使うシングルトンの説明します。
『1つのオブジェクトを異なるオブジェクトで共有して使いたい時』
というケースが良くあります。例えば、DBのコネクションが良い例です。
オブジェクトの生成方法は、
Class名 オブジェクト変数名 = new Class名();
という勉強をしてきたと思いますが、
これを1つのオブジェクトにしたい場合、
Class名 オブジェクト変数名 = Class名.getInstance();
という呼び出し方をして、クラスの方の設計は、
private static クラス名 メンバ変数名 = new クラス名(); // コンストラクタ private クラス名(){} public static クラス名 getInstance(){ return メンバ変数名; }
という感じで、コンストラクタをprivateで宣言し、
インスタンスをクラスのメンバに持たせるというのが特徴です。
これをシングルトンと呼びます。
以上の流れからご理解いただけると幸いですが、
デザインパターンとは、どういう課題をどういう手法で解決させるか、
といったものの集合体です。
なので、デザインパターンを勉強することは、アルゴリズムを勉強する事と同じになります。
投稿2015/10/19 14:31
総合スコア1124
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/19 16:48
2015/10/19 19:40
2015/10/19 21:34
2015/10/19 22:02
2015/10/20 00:11
2015/10/20 03:01
2015/10/20 08:38
2015/10/20 10:06
2015/10/20 10:31
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。