質問でなくて申し訳ありません。
C言語における基礎勉強は大変重要です。
そこで質問なのですが、アルゴリズムを勉強するメリットはあるのでしょうか?
何を行う時にアルゴリズムを勉強するのでしょうか?
以前、本に載っていたのは、「機械学習、画像処理を行う上で数学的なアルゴリズムを勉強する必要がある」と書いてありました。しかし具体的な例題が書いていなかったため書いてあることが本当かどうかわかりませんでした。
私としては、例えば素因数分解のアルゴリズムを勉強したのですが、このような数学的なアルゴリズムが機械学習や画像処理にどのように使われているのか具体的に知りたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答13件
0
さすが、パソコンオタク御用達のteratailだけあって、相変わらず的外れな回答ヴァッカだな。ロボだらけじゃん。
聞かれたことをそのまま答えてるだけ。そういうのは一介の作業工がやる事。エンジニアなら客からの要求の奥にある本当の問題を見つけてその解決策を提供しないとな。
そういう観点で、満を持してするluckerお兄さんの回答は、これだ。
Q: そこで質問なのですが、アルゴリズムを勉強するメリットはあるのでしょうか?
####A: 今のレヴェルだと、アルゴリズムについて考える事は君にとってなんのメリットもないです。スケベ心出してよそ見なんかしてないで、まず、プログラミングの基本的な作法を学ぶ事だけに注力しなさい。
って事。
episteme お父さんが、
「大工さん、ノコギリとカナヅチが使えるといいことあるんですか?」
...使えないとメシが食えねぇよ。
って言ってるけど、そういうのは「家を建てるには、木を切って組み立てなきゃいけないんだよな」って事が認識できて「こんなふうに切ってこことここを繋ぎたいけどいい道具ねぇかな?」って段階になって初めて『ノコギリって物があって木が切りやすいらしい』『カナヅチってのを使うと木をつなぎ合わせる楔打ち込むのに楽らしい』って事がわかり始める。で、『Aの時は場所狭いからもっと小ぶりのノコギリねぇか?』『Bの時は足場不安定だから軽くて取り回しやすいカナヅチねぇか?』ってなる。
知識というのはそうなって初めて、意味を成してくる。
質問者がその段階にあるかどうかくらい理解できないとダメだろ、いい加減みんな。
だからお前らはいつまで経っても下っ端のコーダと大して変わらないんだよ。回答した奴の中で、マネジメントしてプロジェクト回してる奴、ちょっと手を上げてみろ。居ねぇだろ。だからダメなんだよ、おまえらは。
…って書いておくと、来週の月曜日あたりに運営からお怒りのメールが届くんだけどな。
前回はさすがにかなりお怒りだったので、今度という今度はアカバン来てもおかしくないから、この土日が最後の回答になるかも。
まぁ、なかなか楽しかった。
投稿2018/06/23 04:40
退会済みユーザー
総合スコア0
0
便宜上、アルゴリズムを「基本的なもの」(素因数分解でいえば、「ひたすら割れるか試していく」ようなもの)と、「専門的なもの」(数論的に議論を深めた素因数分解)に分けて考えます。
基本的なアルゴリズムは、多くの問題に対して共通して使える枠組みとなるので、プログラマーにとっての基礎トレーニングのようなものになります。
専門的なアルゴリズムは、確かにその問題にしか役に立たないように見えます。しかし、世界はどこで何がつながっているかわかりません。たとえば、純粋に数学的な問題だと思われていた素数論の世界も、RSA暗号の発明によって、一気に実用性のある研究が行われる分野となりました。
teratail.com
に使われている証明書もRSAなので、これを素因数分解できればteratail.com
のフリをすることができる、そういう物となっています。
投稿2018/06/22 13:36
編集2018/06/22 13:36総合スコア145183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
これから先、動かすものを誰かに提供してもらう、誰かが作ったものを、その言うとおりに動かしてそれで満足するなら、アルゴリズムなんか勉強する必要はありませぬ。
まー、楽でいいですな。自分ではなにも苦労する必要はないんだから。
しかし、自分でなにかを作る、自分の手でなにかを産み出そうとするなら、アルゴリズムの知識がないとどうしようもなくなりますな。
投稿2018/06/22 13:29
総合スコア87749
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/22 18:28 編集
0
こんにちは。
そこで質問なのですが、アルゴリズムを勉強するメリットはあるのでしょうか?
何を行う時にアルゴリズムを勉強するのでしょうか?
アルゴリズムを知っていれば、そのアルゴリズムを使うのが適切なプログラムを短期間で開発できます。
ウロウロ試行錯誤せずに1発で良いものを作れますから。
しかし、当たり前ですが対象分野に適用できないようなアルゴリズムは知っていても役には立ちません。
更に、世の中にアルゴリズムは星の数ほどあります。それらを全て把握するのは現実的ではないと思います。
従って、興味のある分野に絞ってどのような有用なアルゴリズムがあるのかを把握し、それを使えるようにすることが重要です。そして、例えば既に誰かがライブラリを用意しているアルゴリズムなら使い方だけ把握すれば十分でしょう。しかし、そのアルゴリズムを微調整することで目の前の問題向けに最適化したいなら、中身も理解しておく必要があります。
私としては、例えば素因数分解のアルゴリズムを勉強したのですが、このような数学的なアルゴリズムが機械学習や画像処理にどのように使われているのか具体的に知りたいです。
機械学習の技術文書や画像処理の技術文書を読めば、それらにどのようなアルゴリズムが使われることが多いのか把握できると思います。
機械学習ならパーセプトロンから始まってバックプロパゲーション、ディープラーニングが有名でしょうか。
画像処理の場合は、ソーベルフィルタ等のフィルタ群、各種コーナー検出・ハフ変換・SIFT/SURF等様々な特徴抽出アルゴリズムなどが本当に多数あります。
素因数分解が機械学習や画像処理に使われるケースがあるのかどうか私は把握していませんが、毛色が異なるのでこれらの分野に使われることは多くはないだろうと思います。
投稿2018/06/22 15:48
編集2018/06/22 18:03総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
アルゴリズムを勉強するメリットはあるのでしょうか?
考えたこともないなー。
「大工さん、ノコギリとカナヅチが使えるといいことあるんですか?」
...使えないとメシが食えねぇよ。
投稿2018/06/22 20:35
総合スコア16614
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/22 20:40
0
アルゴリズムは、広義に何かを実現するための手続きです。
狭義に、クイックソートやユークリッドの互除法などがあります。
特別にある側面で考えたときに優れていて、淘汰の中、生き残っているものが狭義的なアルゴリズムです。
結局プログラミングでやろうとしていることは、数多くの狭義的なアルゴリズムを組み合わせることで広義的なアルゴリズムを作り上げて、やりたいことを実現することです。
ソートをするのに、クイックソートを使えば良い、ということを知っていればクイックソートのアルゴリズムを知る必要はありません。
ですので、新しい狭義的なアルゴリズムを作りたいのでなければ、特にアルゴリズムを勉強する必要はありません。
と極論を言っても構いません。
もっと簡単な例で考えてみればいかがでしょうか。
数学を理解するのに、足し算を知る必要はありません。
足し算は電卓を使えば、人ができなくても構いません。
であれば数学を理解するための道具の仕組みは知らなくても良さそうです。
どうですか、足し算ができない人が数学を理解できそうですか。
勉強は退屈だから、あまり意味を見いだせないことが珍しくありません。
ただ、多くのケースは、簡単すぎるから退屈なわけではありません。
難しくて理解できないから退屈なのです。
そのものが難しくて理解出来ないケースもあれば、それが必要とされる文脈を知らないから理解出来ないケースもあります。
でも逆に考えてみてほしいのは、教えられて難しいことを自力で見出すことができるか、ということです。
勉強して習得していかないと、おそらく一生理解できないことを積み上げていくことになるのです。
言語も勉強してきました。
この言葉は使わないから勉強する必要がないと考えたことはありません。
投稿2018/06/22 16:07
編集2018/06/22 16:19総合スコア8560
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
素因数分解だと機械学習や画像処理とはほとんど関係ありません。しかし、暗号との関連性が高いです。
画像だと、重要なのは信号処理系の技術ですし(FFT, ウェーブレット変換あたり)、機械学習は線形代数、確率論、最適化問題あたりの様々なアルゴリズムが絡んできます。これらのアルゴリズムはその分野の知識がないととても理解はできません。ですから、C言語の入門書に登場することはまずありません。
一般論として「数学的アルゴリズムが画像処理や機械学習に応用されている」と主張することに問題はありませんが、「この本に載っているようなアルゴリズムがそのような分野に応用されている」というニュアンスで書いてあったのなら、著者の方の勇み足だったのかもしれません。
何を行う時にアルゴリズムを勉強するのでしょうか?
エンジニア的な立場から、答えの候補を考えてみましょう。なお、何を以てアルゴリズムとするかによって答えが変わりますが(すべてのプログラムはアルゴリズムである、と極論することもできなくはないかもしれない)、今回は一般的にアルゴリズムとして見なされる範疇のものを相手にします。
候補としては、
0. 自分でアルゴリズム自体を新規開発するとき
- 自分以外が開発したアルゴリズムを実装するとき
- 自分以外が開発・実装したアルゴリズムを利用するとき
がありますが、1,2を仕事にしている人は実際にはごく一部です。よって消去法で3が現実的な答えです。
便利なアルゴリズムは大抵、容易に利用できるような形で実装が配布されています。画像処理や機械学習までは考えないにしても(特定分野の話なので)、hashやソートは汎用的によく使われるアルゴリズムの良い例ですし、そもそもC言語で書いた簡単な四則演算すら、半導体チップの中のMOS-FETからC言語のソースコードの間までには無数のレイヤがあって、その中に無数のアルゴリズムがあって利用できるようになっている、と考えるべきです。それが一行、数文字で書けるのがアルゴリズムの威力と言ってもそんなに間違いではありません。
だから私達は否応無しにアルゴリズムは使っているのですが、思い通り動かない、動くんだけど遅い、ということがままあると思います。こういうとき、アルゴリズムの性質を理解しているかどうかで打てる手がまったく変わってきます。
既存のものに不満を一切持たず使うだけ、ならアルゴリズムの知識は不要かもしれませんが、不満があって改善したい、というモチベーションが生じてくるようであれば、知識がないといじりようがありません。ブラックボックス扱いしていたら何も出来ないということです。
投稿2018/06/22 14:12
編集2018/06/22 14:36総合スコア30933
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/22 18:34
2018/06/23 15:34
0
アルゴリズムを勉強するメリットはあるのでしょうか?
何を行う時にアルゴリズムを勉強するのでしょうか?
アルゴリズムというのは、要するに問題を解くための方法です。アルゴリズムをたくさん知っていれば、それだけ多くの問題に対処できるということです。つまり、プログラムを作る際にいちいち人に聞くまでもなく自力で作れるというわけです。なんかよく判んないからネットで見つけたソースをコピペしてみたけど思った通りに動かない、などと悩んだりすることもありません。
ものすごいメリットだと思いませんか? それに勝るメリットなど私には思いつきません。
投稿2018/06/23 01:31
総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
アルゴリズムを勉強しない / 知らないことによるデメリットを考えてみてはいかがでしょう。
基本的なあるアルゴリズムをしらないと、
それを使ったコードをう読んだときに理解ができなかったり、実装間違いを見つけるらrなかったりします。(特殊なアルゴリズムなら、コメントや付随ドキュメントにアルゴリズム能勢梅井があるかもsれあsねんが、一般的なものには説明なしでつかわれていることが多いです)
効率が悪い実装をしてしまったり、車輪の再発明をすることで時間を無駄にすることになります。
アルゴリズムの勉強では、その実装がただしく動作することの証明(テスト) や計算量/メモリー使用量の見積もりの説明も理解することが大事です。
そういった手法は、自分でなにか新たなアルゴリズムをつくるときに、
そのアルゴリズムを評価したり、実際の実装をするときのコードの良し悪しを判断するときに役立ちます。
追記:
書籍 Graphics Gems
https://www.amazon.co.jp/Graphics-Gems-IBM/dp/0122861663
には、先人が編み出したコンピュタグラフィックの各種手法が記載されています。
高速な描画手法など、自分一人でかんがえていたのでは到達が困難なものが、こういった資料で入手できるのです。
...
与えられた始点と終点の間に連続した点を置き、近似的な直線を引くためのアルゴリズム。
...
整数の加減算とビットシフトのみで実装できるので多くのコンピュータで使用可能である。コンピュータグラフィックスの分野の最初期のアルゴリズムの1つである。これを若干拡張すると、円を描くことができる。
...
プロッターやビデオカードのGPUといったハードウェアで使用されている。ソフトウェアでは多くのグラフィックスライブラリ(英語版)で使用している。非常に単純なので、ビデオカードのファームウェアなどに実装されていることが多い。
円を描くのに三角関数を使っていては速度が出ませんよね。
投稿2018/06/24 01:38
編集2018/06/26 16:04総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
素因数分解が例にあがっていますが
数学的な話だけではありませんよ。
プログラムを通じて、問題・課題に対して解決する手立てを得るというのが私の認識です。
そのため、様々な解決手法が誕生、磨かれてきています。
私をはじめ、エンジニア、デザイナーなどは、手法、パターン化されたデザインなどを駆使して
解決に向けて最適解を得ようとします。それがアルゴリズムだと思います。
それでは、carnage0216さんに改めて伺います、なぜC言語やCUDAを選択しプログラムを学ぶこと選択したのでしょうか。
FPGAを使ってアプローチするのはなぜでしょうか、何かしらの問題に対して解決する手法、最適解、最善解を得るためではないでしょうか。
投稿2018/06/22 13:38
総合スコア187
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/22 18:22 編集
0
アルゴリズムは手段でしかありません。
ですので単独で追及することに意味はほぼないです。しいて言うならば、単独では数学屋さんの仕事です。現実には現実課題を数学的に定式化することが前段階で必要です。
そして、大抵の場合は現実課題を数学的に定式化することの方が大事な問題です。アルゴリズムはプログラムを書き下す段階での必要知識です。これはプログラマには必要なものですけれど、所詮は細かい内務処理上の都合です。
(もちろん、社会活動において、さらに重要な契約締結とか仕様策定もありますけれど、これは割愛します。)
単独でアルゴリズムを議論することはあまり意味をなしません。
これに意味があるとすればプログラム高速化とかメモリ節約とか、プログラマ負担の軽減とかくらいでしょう。
具体的な勘違い例としてはメタヒューリスティクスの問題でしょうか
学術論文とか読むと、**「焼きなまし法を使った○○の方法」とか「遺伝的アルゴリズムを使った○○の方法」とか「ニューラルネットワークを使った○○の方法」**だなんてタイトルをよく見ますが、すべてナンセンスです。(「定式化部分を主張すれば良いのに」、「アルゴリズム名をタイトルにしても意味ない」、とよく思います。)
メタヒューリの世界では「ノーフリーランチ定理」と呼ばれるものがあり、「課題における解の分布が未知であるならば、適切なアルゴリズムを事前に知ることはできない」ということが示されています。つまり、計画時には適切なアルゴリズムは不明です。しいて言うならば、作りやすさで差別化できる程度です。
メタヒューリの成果物の良し悪しを議論しても無駄です。これは同条件では同確率であり、周辺知識なしに「宝くじと競馬どちらの方が儲かるか」と論じるようなものです。確率のみに全て依存するので、人間の選択に関係はありません。
もちろん、様々なメタヒューリを試行したうえで結果を比較するならば成果物を比較できますけれど、これに応じて学術論文の主張を決めるならば統計上の不正を意味します。
ちなみに、メタヒューリの活用は私の学生時代の研究テーマであり、最終的な結論は「論じるだけ無駄」です。
投稿2018/06/23 13:16
編集2018/06/23 13:40総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
そこで質問なのですが、アルゴリズムを勉強するメリットはあるのでしょうか?
他の方が書かれていますが、個人的にはYomogiKOBOさんの書かれていることが刺さりました。
最適とまではいかなくてもより良い方法を求めるのであれば、いろいろな手段を知っていなければいけません。C言語やアセンブラ、GPUにばかりと気を取られて視野を狭めているように思います。リアルタイムでの画像処理をするという目標に対してそれが最適なのでしょうか?画像処理を学ぶ必要はないのでしょうか?
例えば素因数分解のアルゴリズムを勉強したのですが、このような数学的なアルゴリズムが機械学習や画像処理にどのように使われているのか具体的に知りたいです
このような?どのような?具体的に?質問が曖昧なのに具体的には答えらません。
連想ゲームのような難しさというか、アルゴリズムがなぜ重要かみたいな一般的な話しか出てこないでしょう。
以前、本に載っていたのは、「機械学習、画像処理を行う上で数学的なアルゴリズムを勉強する必要がある」と書いてありました。
何の本でしょう。機械学習、画像処理の本ってそもそも数式だらけのような気がしますが・・・。プログラミングの入門書?
投稿2018/06/23 06:10
総合スコア910
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
すでに多くの的確な回答が出ていますが、蛇足ながら。
たとえば、運転免許が取れれば車の運転はできますが、エンジンやステアリングの仕組みを知らないと、車の性能を十分に引き出すことはできませんし、いろいろなトラブルが発生したときに、適切な対処ができません。でも、初心者や町乗りの買い物程度の運転者で、ディーラーに定期点検してもらってたりすれば、そのような知識も不要でしょう。要はどの程度の技術が貴兄にとって必要なのか、です。
同様に、アルゴリズムにはさまざまなものがありますが、それぞれに一長一短で、アルゴリズムによっては特定の条件に弱かったり、向き不向きがあったりします。一般的な用途で、それほど負荷の高くない処理ならライブラリ等を使えば十分でしょうが、用途によってはそうも言ってられないときもあります。
たとえば、並べ替え(ソート)については、非常に多数のアルゴリズムが知られていますが、ある意味悪名の高い「バブルソート」というものがあります。これは、完全にばらばらのものを整列させる上では非常に効率の悪いアルゴリズムですが、何しろ原理が非常に単純ですし、実は、ほどほど順番がそろっている場合は最速であったりもします。そういう場合は、あえてこういうアルゴリズムのプログラムを自分で組んで、使ったりもします。
素数の計算アルゴリズムも、それ自体思わぬところで使われていたりしますし、その方式により長短もあります。また、アルゴリズムそのものより、それを調べ、理解し、応用できるセンスが大事だというのも、すでに回答のあるとおりです。
一種の教養として知っておくことだけでもご自身にきっと役に立ちますし、そうでなくともご自身の習得の進度や必要に応じて、アルゴリズムを勉強されればよろしいのではないでしょうか。
投稿2018/06/27 00:52
総合スコア37
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/23 06:35
退会済みユーザー
2018/06/23 06:56
2018/06/23 07:00
退会済みユーザー
2018/06/23 07:02
2018/06/23 07:42
退会済みユーザー
2018/06/23 07:46
退会済みユーザー
2018/06/23 07:49
退会済みユーザー
2018/06/23 07:53
2018/06/23 08:00
退会済みユーザー
2018/06/23 08:18
退会済みユーザー
2018/06/23 08:19
2018/06/23 12:43
2018/06/23 14:39
2018/06/25 14:12
2018/06/26 02:41
退会済みユーザー
2018/06/26 11:18
退会済みユーザー
2018/06/26 11:39
退会済みユーザー
2018/06/26 11:45
2018/06/26 11:56
2018/06/26 13:34
退会済みユーザー
2018/06/26 17:09 編集
退会済みユーザー
2018/06/26 17:16
2018/06/27 00:31
2018/06/27 02:59 編集
2018/06/27 02:47
2018/06/27 02:50
2018/06/27 03:17
2018/06/27 04:30 編集
2018/06/27 04:56
退会済みユーザー
2018/06/27 12:09
2018/06/27 12:16
退会済みユーザー
2018/06/27 12:20
2018/06/27 12:22
2018/06/27 12:25