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

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

ただいまの
回答率

88.81%

アルゴリズムについて理解したい。

解決済

回答 6

投稿

  • 評価
  • クリップ 1
  • VIEW 1,247
退会済みユーザー

退会済みユーザー

タイトル通りなのですが、

アルゴリズムを理解したい!

と思っているのですが、どのようにして理解していけばよいのか、また何が分かれば理解したことになるのか  といった疑問です。

例えば、基本的なリニアサーチ、バブルソート などのアルゴリズムは、コードを書くことも出来ますし、内容も理解していると思います。

様々なアルゴリズムを暗記していく事が理解した事になるのでしょうか?

何かアドバイス等いただければ幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • hayataka2049

    2019/05/20 12:49

    これまでどんな感じで勉強してきたのでしょうか? 「ちゃんとした教科書を買って読み込んでください」で回答が完結する可能性はそうとう高いと思っています(アルゴリズムのおすすめ書籍は検索すれば出てくるし、過去質問もあったと思うので、実は質問を立てるまでもない)。

    キャンセル

  • sazi

    2019/05/20 16:36

    アルゴリズムと言われているのが漠然としているんだと思います。
    フレームワークなどについて調べると良いのかもしれません。

    キャンセル

  • 退会済みユーザー

    2019/05/21 20:53

    複数のユーザーから「プログラミングに関係のない質問」という意見がありました
    teratailでは、プログラミングに関して困っていることがないと思われる質問を推奨していません。
    「質問を編集する」ボタンから編集を行い、具体的に困っている理由や解決したいことを明確に記入していただくと、回答が得られやすくなります。

回答 6

checkベストアンサー

+17

追記修正依頼や他の回答を見ればわかりますが、ベテランエンジニアたちは「アルゴリズムを理解するには?」という問いに対して「なぜ?」という疑問符を浮かべています。

つまりこれは、エンジニアとして働くためにソートアルゴリズムを学ぶことがそれほど重要でないことを意味します。

プログラミングをするに当たって書かれたソースを読み解くこと、つまり他人がコードとして著したアルゴリズムを理解することは大変重要なことのはずですが、それなのにこのような疑問符が浮かぶのには理由があります。

理由の一つ目は、「車輪の再発明は不要」ということです。

有名なソートアルゴリズムは既に誰かがコード化しています。つまり、これを自分でコード化する必要は無く、何度もテストされ、使用に耐えてきたライブラリ内の信頼のおけるコードを使うのが、実用上最も優れた方法だということです。

理由の二つ目は、それを暗記することがスキルアップに繋がるとは限らないということです。

先ほど述べたように、学習期間が終わった後は、ソートを自分で実装する機会などほぼありません。つまり、ライブラリの開発など特殊な業務でなければ必用のない死にスキルで、よほど本腰を入れて育てなければ仕事の役には立たないということです。

そのため、「なぜ学びたいか」が重要になってきます。

目標があり、その目標を果たすためであれば、あるいはアルゴリズムをコレクションすることも必要になることもあるでしょう。

もし「目標はあるが、なぜアルゴリズムを学びたいか自分でもわからない」ということであれば、このステップはこのくらいにして目標達成の糧となる他のスキルを伸ばすのが良いでしょうし、「趣味だから」と言うのであれば好きにしたらいいと思います。

学習過程でアルゴリズムを学ぶこと自体については「プログラミング特有の考え方に慣れる」「コードを読み解く訓練をする」などの利点がありますが、記憶することの利点は非常に少ないと思います。ググれば出てくるので。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+7

アルゴリズムは、プログラミングの世界では

  • プログラミングや言語といった道具を使って
  • どういう方法で作業を行うかの手順

でしかありません。その種類は用途や目的で多数ありますが、あなたの質問は「洗濯のやり方を理解したいと思いますが、手洗いや二層式洗濯機の使い方も含めて暗記した方がいいですか?」というような質問のようなものです。

もちろん、世界中のそうした手順を調査分類するようなお仕事であればそれもアリかもしれませんが、多分違いますよね? むしろ、「自分が住んでいる家、家族構成や生活パターンに応じた洗濯のやり方を、今有る道具や時間を使ってどうやって行うか」が重要で、世の中の一般的なやり方を把握、暗記したところでおそらくあなたがこの先直面する課題や仕事、趣味の内容にはあまり有益にはならないのではないかとおもいます。アルゴリズムとはそうした作業の手順を明確にして繰り返し実施できる「手順書」のようにまとめたもの。なので「何の、どういう用途のアルゴリズムか」ということを明確にせずに「アルゴリズムを理解したい」というのはナンセンスです。

もちろん、自分が必要とするアルゴリズムを考案したり目的を達成するために世の中に既にある一般的なアルゴリズムがそのまま適用出来ることもあれば、参考になることもあるので暗記が無意味だとは言いませんが、そもそものご質問内容自体があまり意味の無い質問であることを認識された上で、そもそもご自分が「なんでそう思われたのか?」について考えてみられた上で、より具体的な目的や意図を記載されて再度質問されればもう少し具体的で実のあるアドバイスが返ってくるかも知れませんね。

検討してみてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

アルゴリズムはあくまで先人たちの知恵です。

確かにソートやサーチができますが、それはすでに言語やライブラリが提供しています。
よって、自分で組むことはまれ。

C言語ですら、qsort関数と呼ばれる、ソートする関数が用意されています。
なので自分で実装することはまれ。

ではなぜ学ぶのか。

発想を豊かにするためです。

例えば、配列 arr に 0~10の数字が入っているとして、その中に 8 があるかどうか調べてください。
と言われると、アルゴリズムを知らないと、
かなりマシな部類でもforで最初から最後まで調べる。これがリニアサーチ。
(最悪、丸投げ)
でも、先人たちは「バイナリサーチ」「二分探索木」なるものを考え出しています。

これらの二分探索木は木構造が常に小さい値が右(場合によっては左)に来ることを利用して検索する方法。

バイナリサーチは辞書を引く時のように、目星をつけてそこより後か前かを考えて、ずらしていく方法。

この発想の転換が重要。

アルゴリズムを暗記している・していない ではなく、「先人たちはどのようにして解決していったのか」を学ぶ。

OOPを取り入れている言語でのデザインパターンも大体同じ。(あちらはオブジェクトの運営方法。)

例えば、成功を収めている、ビ〇・ゲ〇ツ氏やスティー〇・ジョ〇ズ氏らの成功体験を聞いて、実際にそれと同じようにできますか?

むしろ、環境が違えば役に立ちません。

例えばすでに金があって人脈もあるが、あとは頭だけ...の場合と、頭はあるが金がない...とかそういう状況で違いますし、
アメリカと日本でも相当違う。

それと一緒です。

実際に使える・使えないでいえば、「使えない」と考えたほうがいいです。

ただ、完全に無駄ではないです。

いろんな話を聞いて、「いろんな人がいるんだなぁ」「この人はこういう風に切り抜けてきたんだぁ」っていう感じでしょうか。

つ 考え?


[追記0]

(追記: この部分の追記はどちらかといえばオブジェクト関係ですが、データ構造とアルゴリズムにもかかっているので書きました)

(追記の追記: Zuishinさんからご指摘をいただきました。見当違いなので、打消し線で削除します。)

あ、そうそう。忘れてましたが、「データ構造」はC++以降の言語にはすでに備わっています。 (ライブラリ側だろうけど。) 確かに名称は若干違ったり、PythonとかVBAとかみたいな言語だと、 C言語とかだと配列として扱われるのが「リスト構造」だったり...と差があるようですが、 何かしらのもので提供されています。 C++でいえば、

ベクター: std::vector リスト構造: std::list スタック構造: std::stack
という具合に。 だから不要といえば不要。 でも、「データ構造とアルゴリズム」を学ぶことで使い分けがわかるようになりますよ。 例えば、初心者に多いだろうと思うものが、 「std::vectorとstd::listの違いって何? 同じように使えるけど?」 という感じでしょうか。 でもデータ構造とアルゴリズムがわかっているなら、

ベクター: 動的配列。最後尾に追加していくのは得意だが、途中( (N-1)≦i≧0 ) に追加したり削除したりするのは不得意。できなくもないが、さらに別のベクターを用意して...みたいな無駄が出てくる。 また、ランダムアクセスが得意。 リスト: リスト構造。C言語で言えば自身のポインタを持った構造体でつなげていく方式。 よって、途中( (N-1)≦i≧0 )の追加や削除が得意。ただし、ランダムアクセスが苦手。

というのが解れば、自分がやりたい処理から考えることができる。 もしランダムアクセスが不要だけど途中追加や削除を頻繁に行うならリスト構造( C++でいうならstd::list ) 、途中追加とかは不要だけどランダムアクセスをすることがあるならベクター( C++でいうならstd::vector )... という風に使い分けができる。 そういう、「弱みや強みを理解し、使い分けができる」っていう利点もあるっちゃあるね。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/20 15:11

    あー、なるほど...
    わかりました。削除しておきます。(追記の部分)

    キャンセル

  • 2019/05/20 15:22 編集

    いえ、私の二つ目のコメントは BeatStar さんのコメントを読む前に書いた物で、「C++ 以降」というところから何か誤解があるのではないかという確認で、削除するほど不適切というわけでは……言葉足らずですみません。

    キャンセル

  • 2019/05/20 15:58

    あー、そうなんですね...
    まっ、いいか。

    キャンセル

+1

... 様々なアルゴリズムを暗記していく事が理解した事になるのでしょうか? ...

暗記は重要ではありません。
すでにある手法はそれを探して,実際のコードにおそ仕込めば済みます。
グラフィック関係では アルゴリズム集の本もあります。
[ps://www.amazon.co.jp/dp/B003Z9K11Q](ps://www.amazon.co.jp/dp/B003Z9K11Q) Graphics Gems

アルゴリズムよりデザインパターンを勉強したほうが良いかもしれません。
https://www.amazon.co.jp/dp/B015R0M8W0/Game Programming Patterns ソフトウェア開発の問題解決メニュー 
https://www.amazon.co.jp/dp/B0126HZGP8
Amazon Web Servicesクラウドデザインパターン設計ガイド

落とし込んだコードの質を評価するための知識も必要です。
確率、離散数学,情報理論...

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

なにをしたいのかよーわかりませんが、とりあえずは暗記していけばいいんじゃないでしょうか。
それでなにかいいことがあるかはわかりませんが。。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

名前と用途・特性だけ知っていれば(実装できなくても)十分かと思います.

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

同じタグがついた質問を見る