質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

7回答

4167閲覧

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

wego

総合スコア12

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

1グッド

4クリップ

投稿2015/10/19 13:28

編集2022/01/12 10:55

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

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

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

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

-追記-

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

DrqYuto👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2015/10/19 16:52

面接というのは人事評価面接? 採用面接(新卒? 中途?)、どれでしょう。 技術職ですか、それ以外ですか?
wego

2015/10/19 17:50

皆様、さっそくの投稿ありがとうございます! 面接は中途の技術職になります。
yuba

2015/10/19 17:52

では、想定するプログラミング言語はなんですか?
wego

2015/10/19 18:13

Java言語がいいです!
wego

2015/10/19 18:16

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

2015/10/19 18:18

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

2015/10/20 12:36

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

回答7

0

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

追記:

... 面接課題としてアルゴリズムの問題 ...

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

再追記:

投稿2015/10/19 13:47

編集2015/10/19 15:17
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

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

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

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

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

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

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

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

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

投稿2015/10/20 10:48

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wego

2015/10/20 12:34

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

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

KenjiObata

総合スコア440

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wego

2015/10/20 07:14

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

2015/10/20 08:07

事前にどのような問題が出題されるかを知らされるということは、あえて知らないこと(問題点)に対して、人に聞く、本で調べる、ネットで調べるなど自ら行動を起こし、課題を解決できるかどうかを試験されているのかもしれません。 本当の仕事であれば、「わからないので出来ません。」と答えた時点で無能のレッテルを張られます。しかし、わからなくても自力で模索してなんとかできるひとならば、かなり優秀な人だと思います。 少なくとも、課題に対してあきらめず、必死にもがく事は大事だと思います。
wego

2015/10/20 12:25

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

0

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

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

投稿2015/10/20 00:08

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wego

2015/10/20 05:30

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

2015/10/20 05:33

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

2015/10/20 12:39

基本情報向けのアルゴリズム本を終えておられるのですね。 そして、採用試験はCodeIQやPaizaみたいなプログラミングクエストであると。 さらに先へ進むなら[プログラミングの宝箱 アルゴリズムとデータ構造](http://www.amazon.co.jp/dp/4797363282)この本が中級へのステップアップに手広く内容を押さえつつわかりやすい語り口でおすすめできます。
guest

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

argius

総合スコア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

TetsujiMiwa

総合スコア1124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2015/10/19 16:48

いえ、デザインパターンとアルゴリズムは全然違います…
TetsujiMiwa

2015/10/19 19:40

私の意見が間違ってるか否かは別として、デザインパターンとアルゴリズムが同じという主張は全くしてないです。「アルゴリズム」=「課題を解決する手法」として、デザインパターンを薦めています。この辺り、誤解されていたとすると、私の表現の仕方に問題があったと考えます。誤解した(を与えてしまった)理由を知りたいところです。
yuba

2015/10/19 21:34

アルゴリズムは数学上の課題をコンピュータに解決させるための手順で、デザインパターンは設計上の課題をプログラマが解決した例です。 課題、解決というキーワードが似ているだけで共通性が見当たりません。
TetsujiMiwa

2015/10/19 22:02

なるほど、アルゴリズムといった場合、「数学上の課題」と限定されたニュアンスを感じ取ってしまうわけですね。wikiには「数学、コンピューティング、言語学、あるいは関連する分野において」とあり、知恵蔵2015には「問題を解くための数学的計算手順。算法」とあるので、あってるとも間違ってるとも言えと思いますが、認識齟齬の原因がわかりました。ありがとうございます。
eripong

2015/10/20 00:11

基本的にyubaさんの意見に賛成です。 通常、シングルトンはアルゴリズムに含めないと思います。 また、アルゴリズムというとよく例にあがるソートの方法も、 デザインパターンに含めることは、ないと思います。 アルゴリズムは、課題を解決するための手順で、 デザインパターンは、課題を解決するためのパターンと理解しています。 手順を学ぶこととパターンを学ぶことは違うと思います。 デザインパターンを学ぶことで、アルゴリズムの理解が深まることがある、 という主張であれば分かりますが、同じというと、非常に違和感があります。
yuba

2015/10/20 03:01

アルゴリズムとデザインパターンの対象スコープの違いをJavaの標準クラスで表現しますと、Listインターフェースがいい題材になります。 ●デザインパターン ・Listインターフェースを用意して、ArrayList, LinkedListという別実装を用意しても同じように扱えるようにしているのがStrategyパターンです。 ・iterator()メソッドを用意し、統一的な全件アクセス手段を用意しているのがIteratorパターンです。 ●アルゴリズム ・LinkedListを実現しているのが隣接リストというデータ構造であり、その要素追加アルゴリズムはO(1)、挿入アルゴリズムはO(1)、削除アルゴリズムはO(1)、ランダムアクセスアルゴリズムは平均O(n)の計算時間です。 ・ArrayListを実現しているのが動的配列というデータ構造であり、その要素追加アルゴリズムは平均O(1)、挿入アルゴリズムは平均O(n)、削除アルゴリズムは平均O(n)、ランダムアクセスアルゴリズムはO(1)の計算時間です。
cheeeeeeese

2015/10/20 08:38

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

2015/10/20 10:06

定義認識に齟齬がある状態で議論を重ねても誰もが納得できる結果には至らないと思います。 もっとも、アルゴリズムの課題面接には絶対にデザインパターンの概念・考え方が出ないと主張されるのであれば、私の回答に批判を重ねる意義はあるかとは思いますが。。。 私の主張したい大筋(大枠といったほうが良いのかな)はKenjiObataさんの回答の通りです。課題面接の意図は、アルゴリズムという言葉を正確に知っているかって事ではなく、「どういう課題をどういう手法で解決させるか」にあるんじゃないかと予想してます。
eripong

2015/10/20 10:31

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問