• ベストアンサー

プログラマにとって「アルゴリズム」や「データ構造」の知識は必須ですか?

最近の、いわゆるパッケージソフトウェアや、Webアプリケーションの開発においては、 必要なコンポーネントをインポートして部品を組み立てていくイメージで コードを書いていくというのが主流だと思います。 ほとんどのプログラミング言語には、すでに便利な関数やパッケージが用意されており、「アルゴリズム」や「データ構造」といった知識はあまり必要になりません。 例えば、データをソートしたい場合、クイックソートなどで自分で実装しなくても、すでにソート関数が用意されているので、その関数を使用すれば良いわけです。 そのような環境においても、プログラマにとって「アルゴリズム」や「データ構造」の知識はやはり必須ですか? 時々、 ・「優先順位付き待ち行列」くらいは、スラスラ実装できなければ、プログラマとしては半人前 ・「離散数学」をしっかり理解していないと、プログラマとしては致命的 などという話も聞くのですが、皆さんの意見を聞かせてください。

noname#163856
noname#163856
  • Java
  • 回答数5
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • aton
  • ベストアンサー率47% (160/334)
回答No.5

「作る」能力は必要はないかもしれませんが,「使う」ためにはアルゴリズムやデータ構造の存在を知っていて,理解している必要があると思います。 アクセスメソッドを例に取ると,B-treeを使った方がいい場合もあれば,ハッシュを使った方がいい場合もあります。データ集合の性質によっては,インデックス経由よりもフルスキャンした方が効率がいい場合もあります。それぞれのアルゴリズムがどういう原理で動作していて,従ってどういう特性を持っているかを理解していないと,実際に自分が使う段になって,そのアルゴリズムに適したケースなのかそれとも不適当なのか判断できないのではないでしょうか? データ構造でも同じことで,あるアプリケーションのデータ構造として,ヒープがいいのか,配列がいいのか,リンクトリストがいいのかは,それぞれの構造の成り立ちと特性を理解していないと判断できないのではないかと思います。 ただ,場合によっては,理解しているだけではなく作れることが求められるかもしれません。例えば,使っているデータのフォーマットと,既成の部品が扱えるデータのフォーマットが微妙に違っていることもあります。こうしたケースでは,これらのアルゴリズムやデータ構造を自分で作ることが要求されるでしょう。 いずれにせよ,アルゴリズムやデータ構造の「理解」は,ベースラインとして持っておいたほうがいいように思います。

noname#163856
質問者

お礼

ご回答していただいた皆様、ありがとうございます。 今後の参考にさせて頂きます。

その他の回答 (4)

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.4

主な「アルゴリズム」「データ構造」の知識に関しては 全てを丸暗記しておく必要はありませんが、どういった ものが有るか概要だけでも覚えておくと、それらが必要 になった時に既にあるものを新規に自作する手間が省け ます。 「アルゴリズム」の勉強というと○○ソートとか△△法と いった物を丸暗記する事だと思いがちですが、本当に必要 な事はどのようにして処理手順を最適化・効率化するかと いう考え方自体です。 ちゃんとアルゴリズムを整理して作れば数十ステップ程度 でできるものを、思い付くままに作っていくだけでは数百 ステップ以上になったり、数行だけ異なる処理を複数作成 して結局は無駄な所ばかり多いが数千ステップ以上の大作 プログラムにしたりしてしまいます。 この様な大作プログラムは作るのも大変ですが、それ以上 にデバッグ・メンテナンスも困難となり深夜残業・徹夜の 連続を招く原因となります。 深夜残業・徹夜の連続が好きなのであれば、思い付くまま 未完(?)の超大作プログラムを作って下さい。 #プログラムのみでなく、仕事の手順もきちんと整理した #物にすれば短時間に効果的な作業が可能になります。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.3

安月給でこき使われてあっという間に使い捨てられるプログラマで良いのなら、その手の知識はなくても良いですよ。

  • thamansa
  • ベストアンサー率40% (95/232)
回答No.2

確かに、ソートなどのアルゴリズムは、ライブラリ中に実装されていますから、「新たに実装する必要」はないでしょう。 でも、バブルソートとクイックソートの違い(計算量の違いがなぜ発生するのか)を理解して、必要に応じてどちらも実装できるだけのスキルを持っているエンジニアと理解していないエンジニア、複雑な業務用件を効率よく処理するプログラムをかけるのはどちらでしょうか。 いろんなアルゴリズムを習得していると、複雑な要件のプログラムを設計しているときに、部分的に既知のアルゴリズムを応用できることに気づいたりすると思います。その点では、経験だけで作成しているプログラマは、もっと効率のよい方法があることに気づかずに実装していたりするのでしょう。

  • okg00
  • ベストアンサー率39% (1322/3338)
回答No.1

現場によっても違うかもしれません。また、「プログラマ」の定義によっても違うかもしれませんね。 コーダーとして考えた場合、実際の現場では内部設計段階でアルゴリズムは網羅されている事も多いですから、プログラマには仕様書通りに、正当にかつ妥当に実装する事を望むだけです。平易なアルゴリズムを用いてこそ、後々のメンテ性を考えれば良いのでは? 内部設計までするとするなら...業務によるかもしれませんが、帳票を出力したり画面設計をするぐらいの普通の業務ならトリッキーな処理はこのまれませんねえ。制御系やミドルウェアなどでしたらあるかも知れませんけど。

関連するQ&A

  • データ構造とアルゴリズムの違いについて教えて頂けないでしょうか。

    データ構造とアルゴリズムの違いについて教えて頂けないでしょうか。 データ構造とアルゴリズムについて学習しています。 (質問事項) ・データ構造とアルゴリズムの違いについて教えて頂けないでしょうか。 詳細に教えて頂けると大変助かります。 (私の現状) たとえば、データ構造は、単純なものでは、配列やコレクション、2分木などの構造で、アルゴリズムは2分木探索の実装方法だと思っています。 データ構造とアルゴリズムについては初心者です。 (現在、就職活動中で、これらを学ぶ必要がありご質問させて頂いています) どうか、皆様、教えて頂いた情報を最大限に活用させていただきますので、(皆様にとってはくだらない質問かもしれませんが…)どうぞよろしくお願いいたします。

  • アルゴリズムが全くわからない

    「Javaによるはじめてのアルゴリズム」や、「Cプログラマのためのアルゴリズムとデータ構造」という本を買ったのですが、 数式や図表が難しくて理解できません。 (中学並の数学の知識しかないので・・) 私のような初心者でもアルゴリズムが理解できるようになるような、 数学やアルゴリズムの、本やウェブサイトなどがあれば教えてください。 方法論とかでも構いません。 よろしくお願いします。

  • データ構造とアルゴリズムの問題が分かりません。

    データ構造とアルゴリズムの問題が分かりません。 以下の問題で悩んでいます。 索引は書籍中の単語が書籍の何ページ目に出現するかを表す。もちろん、索引に含まれるある単語が複数のページに出現する場合や、索引に含まれる複数の単語が同一のページに出現する場合もある。 この索引で対象とする単語は、その書籍の中で重要な意味をもつものとして、また、特定の単語はたかだか数ページにのみ出現すると仮定する。 (1)単方向リストを用いてこのようなデータ構造を実現する場合、C言語ではどのように宣言をすれば適切か、struct宣言を用いて示しなさい。 (2)単方向リストを用いてデータ構造の場合、特定の単語が何ページ目に現れるか探すにはどのようなアルゴリズムを適用すれば適切か、探索に必要な時間計算量とともに示しなさい。 (3)二分探索木を用いてこのようなデータ構造を実現する場合、C言語ではどのように宣言をすれば適切か、struct宣言を用いて示しなさい。 (4)二分探索木を用いたデータ構の場合、特定の単語が何ページ目に現れるか探すにはどのようなアルゴリズムを適用すれば適切か、探索に必要な時間計算量とともに示しなさい。 (5)二分探索木を用いたデータ構の場合、アルファベット順の索引を出力するたねには、どのような整列アルゴリズムを適用すれば適切か、整列に必要な時間計算量とともに示しなさい。 テストに類題を出すと先生はおっしゃってたので、どうしてもすぐに回答が必要です。先生にも質問したのですが、テストに類題を出すから教えられない。自力で頑張れと言われ困っています。 どなたか御助力よろしくお願いいたします。

  • ソートのアルゴリズム等はいつ使う?

    データベースの本などを読むと、ソートのアルゴリズムなどが出てくるのですが、それらはいつ必要とするのでしょうか? MySQL等を使っていると、自動でやってくれるコマンドが用意されているので、特に意識することがないのですが…?

  • ソートアルゴリズム

    お忙しいところすいません。 先日授業で出された課題がどうしても分からなかったので教えていただきたいと思っています。 どうやってプログラムを作ればよいでしょうか。 問題は、 『N件の乱数データを用意し、昇順(または降順)に並べる。 データ件数、ソート所用時間を表示する。 ソート時間1~100秒で処理できるデータ件数を確認する。 ソートアルゴリズムは2種以上作成すること。』 です。

  • アルゴリズムとは何なのでしょうか?

    学校でアルゴリズムを習っているのですが、 アルゴリズムとは何なのでしょうか? 教科書として、 「新・明解 C言語によるアルゴリズムとデータ構造」という本を買ったのですが、 内容的には以前C言語を勉強するために読んだC言語の勉強本とあまり変わらないような気がします。 スタックやキュー、ソートに検索など確かにC言語を教わる本には書いてないことはありましたが、 要するにC言語の別の面ということだと思いました。 意味的にはアルゴリズムは数学でいう計算方法、 つまり答えを求めるための色々な方法というように考えたのですが、 実際アルゴリズムとはどのようなものと理解すればいいのでしょうか?

  • 東大院試のアルゴリズムとデータ構造の対策について

    東大情報理工学系研究科の電子情報学専攻を、将来受験しようと思っている大学2年です。 とある東大院試対策のサイトを見ていたところ、 東大情報理工学系研究科電子情報学専攻の院試の"アルゴリズムとデータ構造"の 対策の参考書として、 石畑清著の「アルゴリズムとデータ構造(岩波講座 ソフトウェア科学 3)」 http://www.amazon.co.jp/dp/4000103431/ref=as_sl_pc_tf_lc?tag=masaa0909-22&camp=1027&creative=7407&linkCode=as4&creativeASIN=4000103431&adid=1457SVYVYB097YSW8HXE&&ref-refURL=http%3A%2F%2Fblog.livedoor.jp%2Fsouzouzyouhou2%2Farchives%2F1007400273.html が紹介されていました。 しかし、私は既に柴田望洋著の「明解 Javaによるアルゴリズムとデータ構造」という 参考書をやっており、しかもあともう少しで読み終わりという段階です。 そこで質問なのですが、「明解 Javaによるアルゴリズムとデータ構造」を終えた後に、 石畑清著の「アルゴリズムとデータ構造(岩波講座 ソフトウェア科学 3)」  もやっておくべきでしょうか? それとも、やる必要はないでしょうか? 調べてみたところ、どうやら 石原清著の「アルゴリズムとデータ構造(岩波講座 ソフトウェア科学 3)」は、 東大のプログラミングの講義で教科書として使われているみたいなので、 やるべきか否か非常に迷っております。 (東大院試対策のサイトによると、内部生と同じ教科書で勉強するのが 院試対策として有効らしいので) 因みに、もしやる必要がないのであれば、今やっている柴田望洋著の参考書を 終わらせた後に「アルゴリズムイントロダクション」という参考書を1巻・2巻ともに やろうと思っています。 アルゴリズムイントロダクション1巻 http://www.amazon.co.jp/dp/4764904063/ref=as_sl_pc_tf_lc?tag=masaa0909-22&camp=1027&creative=7407&linkCode=as4&creativeASIN=4764904063&adid=1NH5SRG929KZQ3DDVWNH&&ref-refURL=http%3A%2F%2Fblog.livedoor.jp%2Fsouzouzyouhou2%2Farchives%2F1007400273.html アルゴリズムイントロダクション2巻 http://www.amazon.co.jp/dp/4764904071/ref=as_sl_pc_tf_lc?tag=masaa0909-22&camp=243&creative=1615&linkCode=as1&creativeASIN=4764904071&adid=1VJYPYJWA2RARH4JA1MB&&ref-refURL=http%3A%2F%2Fblog.livedoor.jp%2Fsouzouzyouhou2%2Farchives%2F1007400273.html それでは回答よろしくお願いします。

  • アルゴリズム論の参考書

    アルゴリズム論のよい文献をさがしています。データベース論ではなくてNP困難や貪欲アルゴリズム、最適化論、ヒューリスティック、離散数学に焦点を当てた実用的かつ理論的な参考書を探しています。プログラマをやっているので、コードを書く前に(同じことを実行するが異なったコードスタイルの関数等への)スピードを論理的に比較したり、輸送問題やスケジューリング論が理解できるようになるのが主な目的です。初心者向けと上級者向け、分けて紹介していただければ幸いです。 よろしくお願いします。

  • プログラマの数学知識

    こんばんわでございます。 プログラマには数学が必須?みたいな記載をたまに見かけます。 勿論業務や業界によって違うのだとは思いますが……。 例えば、大学数学程度のレベルは使いこなすと出世が早い(良く出来てるから?)等聞きます。 まぁ、じゃあ具体的に大学数学って何よって話しにもなるのですが。 そこでご質問なのですが、プログラミングが上手い方々はやはり数学知識は豊富なのでしょうか? それとも数学的考え方が上手ということでしょうか? また、もし数学知識が必要という場合は、具体的にどのような数学の知識(例えば、~関数やら~概論等)が必要なのでしょうか? 漠然とした質問で申し訳ございませんが、宜しければ教えて頂けませんでしょうか? 宜しくお願い致します。

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

    学校の課題なのですが、試験の得点順(降順)に学生番号と得点を表示することができるシステムを行っています。 仕様は下記の通りです。 外部仕様 1.試験の得点順(降順)に学生番号と得点を表示 2.機能メニュー(1:追加、2:削除、3:表示、1~3以外:終了)で操作できる 3.機能メニューの1:追加を選択すると、キーボードから学生番号と得点を入力することができる 4.機能メニューの2:削除を選択すると、キーボードから入力した学生番号のデータを削除することができる。 5.機能メニューの3:表示を選択すると、入力されているデータが、得点順に表示される 内部仕様 1. 使用言語はC言語とする 2. ダミーノードを使わない順方向リスト構造とする 3. リストのノードは構造体を使用する 4. リストのノードが常に得点の降順で並ぶように追加する 5. 入力データ型は、機能メニューを選択するための数字と得点は整数型、学生番号は文字列型とする 6. 先頭のノードのポインタを格納する変数名はheadとする 7. 全体の処理の流れは図1のとおりとし、【テンプレート・プログラム】の必要箇所に必要な機能を追加して完成させるものとする。テンプレート・プログラムで使用されている変数名は、そのまま使用すること。 8. 機能メニューは、関数名:menu()で表示する。menu()の仮引数は無し、戻り値は、キーボードから入力されたメニュー番号(整数)とする。 9. 機能メニューの1:追加では、関数名:insert()において先頭ノードから最後尾ノードに向けて順にキーボードから入力した得点と大小関係を比較し、得点の降順で並ぶように挿入位置を決めるためのアルゴリズムを考えて、新たなノードをリストに挿入する。関数名:insert()、仮引数:無し、戻り値:無し。なお、新しく追加するノードのポインタアドレスは変数pを使用する。追加する場所を探すために参照するノードのポインタアドレスは変数p2を使用する。 10. 機能メニューの2:削除では、関数名:del()においてキーボードから削除する学生番号を入力し、該当するノードを削除する。学生番号が見つからない場合は何もしない。関数名:del()、仮引数:無し、戻り値:無し。なお、文字列の比較には、strcmp()関数を使用する。 11. 機能メニューの3:表示では、関数名:disp()において先頭のノードから学生番号と得点を表示する。関数名:disp()、仮引数:無し、戻り値:無し。 この、追加機能のinsert、削除機能のdel、dispをどのように記述すればいいのかが分かりません。 分かる方宜しくお願いいたします。

専門家に質問してみよう