🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アルゴリズム

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

Q&A

解決済

10回答

2830閲覧

アルゴリズムの勉強法

y97

総合スコア10

アルゴリズム

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

0グッド

1クリップ

投稿2019/10/03 15:39

エンジニア志望の学生です。
https://www.codereading.com/algo_and_ds/algo/binary_search.html
プログロムの意味は分かったのですが、半年後に何も見ずにこのプログラムを書いてくださいと言われてもかけないと思います。
まだ理解が足りてないのか、エンジニアの人もかけないのか教えてください。

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

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

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

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

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

miyabi_takatsuk

2019/10/03 15:57

半年いらないですよ。 僕は一時間くらいでいけると思います。 デキる人なら、下手したら10分くらいでいけるんじゃないですかね。 でも、やりませんよ、お金もらえるわけでないので。(のわりには時間かかる) で、何が聞きたいのかな? 何が問題で、どうしたいんですか? このサイトは、プログラム上で困って、どうしても自己解決できない! って時に、プロアマ問わずの人から回答を聞きたい、というQAサイトです。 これを作って欲しいとお思いなら、 まずは自分で書いてみましょう。 その上でどうしてもわからない部分があったら、質問しましょう。 でないと、身につかないですし、 このままだと、問題も課題もない目的のない質問になりますよ。
退会済みユーザー

退会済みユーザー

2019/10/04 01:49

質問は何ですか?
y97

2019/10/08 10:33

皆さん多くの回答をありがとうございます。全部回答を見させていただきました。
y97

2019/10/08 10:42

「問題・課題が含まれていない質問」をしてしまいました。今後はこのような「問題・課題が含まれていない質問」をしないように気を付けます。
guest

回答10

0

こんにちは。

半年後に何も見ずにこのプログラムを書いてくださいと言われてもかけないと思います。

きっとそのようなプログラマーは多いと思います。(私もその一人)
競技プログラミングでもしているのでもない限り、検索や書籍、過去の記録などなどを見ないという愚かな縛りをするプロはいないと思います。

投稿2019/10/03 15:53

Chironian

総合スコア23272

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

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

0

まだ理解が足りてないのか、エンジニアの人もかけないのか教えてください。

まだ理解が足りていないのです。
他人のプログラムの意味が理解できてもアルゴリズムの仕組みを理解していなければ自分でコードを書くことはできません。逆に言うと、一定レベル以上のエンジニアであれば、アルゴリズムの仕組みさえ理解すれば誰かの書いたコードなど見ずとも自力で書けます。サーチやソートなどの基本的なアルゴリズムは理解しておくべきでしょう。
より上級レベルになれば、データの動きや振る舞いなど分析して目的の結果を得るためのアルゴリズムを自ら導き出すということも要求されます。

投稿2019/10/04 04:47

catsforepaw

総合スコア5944

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

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

y97

2019/10/08 10:45

はい。やはり、コーディング経験を積んでいきたいとおもいます。回答ありがとうございます
guest

0

ベストアンサー

主に「エンジニア」とは、何かしら要件や設計があって、それをもとにアプリケーションを製作していく人たちです。
(もちろん要件定義や設計も仕事のうちです)

その「何も見ずに」がどの程度の制約を想定しているか分からないのでなんとも言えませんが、要件も設計もなしに作るのは無理です。
確固たる目的があり、それを達成する(または現状を改善、問題を解決する)ためにアプリケーションは作られます。

リンク先のコードもそのさきは何かしらの目的を達成するために利用される考え方のひとつと言ってもいいでしょう。

ですので、
「こんな考え方がある」と引き出しにしまう程度で良いと思います。

そして「どういうときに使えそうか」を考えるだけで良いと思います。

コードは暗記するものではありません。
それぞれの言語には様々な機能がありますが、「ある機能を使うためにアプリケーションを作る」ということは現場ではありません。
機能を持つ言語すらあくまで「目的達成なための道具」です。

お前(機能)のためにチーム(アプリ)があるんじゃねぇ
チーム(アプリ)のためにお前(機能)がいるんだ

です。(分からなかったらごめんなさい)

確かに道具はたくさん揃えておいた方が良いですが、すべてをなんの参考もなしに空で出せる人っていません。言語を作ったチームの人ですらマニュアルを一字一句覚えてはいないと思います。

学生とのことで、レポートを提出することはあると思いますが、自身の書いたレポートをどれくらい覚えていますか?一字一句間違えずに言えるでしょうか?

「こんな風なものがある」「こんな項目で大体こんな内容で書いた」
そんなものだと思います。

リンク先も「コードを読む」「暗記する」のではなく、「こういうアルゴリズムがある」程度の、概念をおさえておくにとどめて、「どういう場面で使えるか」を考える方向にシフトされては如何でしょうか?

その何の根拠かわからない「半年」という期間をコードの理解に努めるのではなく、あくまで「アルゴリズムの適用」「応用」にあてては?
初めのうちは「このアルゴリスムを適用する前提の何か」で良いと思います。
そのうち「これを実現するためにはこのアルゴリズムが使える」と、論理的な思考が育っていると思いますし、その思考は現場で充分通じるものになります。

投稿2019/10/04 01:32

編集2019/10/04 01:35
m.ts10806

総合スコア80875

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

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

0

この程度の「アルゴリズム」であれば,最低限のプログラミングができる人であれば
「二分探索」という言葉の意味自体を知らなくて,且つ,その説明も与えられない場合を除いては,「自分は書けない」なんてことは無いと思います.

あなたが書けないと思う理由は,

  • アルゴリズムの内容を理解できていない
  • このレベルのコードをまだ自身で書けないだけ

のどちらでしょうか?
後者に関しては,まぁそんなのは(学習を続けていれば)「半年後」には余裕で解消されているでしょうから,
現在そこが不安なのだとしても,とりあえずアルゴリズムの内容側を紙とペンとかを使ってでも理解しておけばよいのではないでしょうか.

投稿2019/10/04 01:25

fana

総合スコア11985

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

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

fana

2019/10/04 01:55

実際に必要な(というか,当たり前のことと見なされる)のは,こういった一般的なアルゴリズムの内容(「概要」かな?)くらいは知っていることです. (自分で書けるか否かが問題になるのは,本当に自前で書かねばならなくなったときだけでしょうし) ・その存在自体を知らなければ,何かの問題への対処方法を考える際にそれが選択肢に上がらないことになってしまいます. ・名前だけ知っているが内容は知らん(笑)とかだと,その問題に対してどの程度有効なのか(他と比較したらどうか)といった判断が付きません.よく「ライブラリにあるから/既存実装があるから,その内容は全く知らなくていい」とか言い出す人がいますが大間違いです.最低限知っているべきことは知っていないと適切に使えません.
y97

2019/10/08 10:38

わかりました。概要を理解して、コーディング経験を積んでいきたいです。 回答ありがとうございます。
guest

0

まだ理解が足りてないのか、エンジニアの人もかけないのか教えてください。

職業プログラマーであればプログラムの詳細を覚えていなくても二分探索の概要を覚えていれば、何も見ずにコードを書けると思います (「バイナリサーチってどういうアルゴリズムだっけ……?」というレベルで忘れていれば書けませんが)

あなたの書けないと思うのは、理解が足りないのではなく、目的の動作をコーディングする経験が足りないからではないでしょうか。

ただChironianさんの書かれているように、わざわざ参考にできる資料を見ないという縛りを入れることは通常ありませんし、今の時代に二分探索のような基本的なアルゴリズムを自前で実装することはほぼ無いと思います。
(そういうのはライブラリやミドルウェアがやってくれるので)

投稿2019/10/03 16:30

ku__ra__ge

総合スコア4524

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

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

y97

2019/10/08 10:36

はい、私はコーディング経験が少ないです。 コーディング経験をたくさん積みかけるよう努力します 回答ありがとうございます
guest

0

コードをまるごと理解するのではなく、コードが「何をしたいのか」=アルゴリズムを理解していれば、コードを別の場所で書き直すこと自体はできます。
むろん、前のコードと一字一句同じにはならないでしょう(使う変数名とか違ったりしますから)。それは当たり前で、気にすることではありません。

コードとはアルゴリズムを(プログラミング言語で)表現したものなのですから、どちらを覚えるかと言われればアルゴリズムを覚えるべきですね。

あと、コードで覚えるとそのプログラミング言語に拘束されてしまいますが、アルゴリズムで覚えているなら別のプログラミング言語でもそれを書くのは難しくありません。それぞれの言語毎の癖があるにせよ。

そういう意味でも、プログラミングを学ぶことはプログラミング言語を学ぶこととイコールではあり得ません。
割と多くの人が勘違いしていることですが。

投稿2019/10/04 05:24

tacsheaven

総合スコア13703

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

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

y97

2019/10/08 10:43

回答ありがとうございます。
guest

0

アルゴリズムの本質は実装とは無関係です。

プログラミングで書けるかどうか以前に、自分の手を動かしてできるかどうか考えてみましょう。

バイナリサーチなら、番号付きのカードの束とかを自分の手でバイナリサーチしてみてください(二分するときは大雑把にでいいです)。手でできるならアルゴリズムの基本はわかっていると思います。

アルゴリズムの考え方がわかっていれば、原理的には使いこなしているプログラミング言語があれば書けます。
(ただこういうのって、実際に書くとインデックスの扱いが面倒臭かったりはするが……よく考えてデバッグしながらやればいつかはできる)

投稿2019/10/04 05:19

編集2019/10/04 05:31
hayataka2049

総合スコア30935

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

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

y97

2019/10/08 10:44

回答ありがとうございます
guest

0

「図的に理解する」ということも大事かと思います。配列から目的の値を探す二分法とは違いますが、
√2などの近似値を求める際に二分法を使うことをイメージしてもらうと、

二分法

「真ん中だと目的の値より大きいから、目的の値があるとしたらより手前の位置のはず」
というようなことさえ理解できれば、二分探索のコードは書けます。

※ただし、リンク先のコードは間違いを含んでいます。最初のインデックスと最後のインデックスの和を取った段階で、オーバーフローする可能性があります。

投稿2019/10/03 17:12

swordone

総合スコア20669

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

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

0

推奨されない内容のご質問かもしれませんが、エンジニア志望なものの不安があるのだろうと思ったのと、私自身も興味をおぼえましたので回答をひとつ。(そういう意味ではこの回答も推奨されないものかもしれませんね)

一応現役のつもりの私の場合ですが、少なくともバイナリサーチ/2分探索に関して、書け!と言われれば一応は書けるつもりです。ですが、2分したときに奇数になる場合のケースで少し悩む気がしますし、単体テストしたらバグではまるかも。
コーディング自体の速度だと、特に競プロerのような方々には惨敗するのは覚悟しています。

2分探索の考え方は、意外と実生活でも役に立ちますよ。ある項目でソートされた大量のものからひとつ探す様なケースがあったりします。その考え方を思い出してコードを書くようなかんじです。一発で動く完璧なコードを書く自信はとてもありません。

業務で自分で実際に書くか、と言われれば他の方の回答やコメントにあるように、書きません。衆知で、充分テストされ、荒波にもまれた既存のコードや製品を使わせてもらいます。

投稿2019/10/03 16:19

dodox86

総合スコア9254

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

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

0

私は書けません。
エンジニアでないから、書けなくてもいいかも?

というより、バイナリサーチなんて、必要な時に本を見ればいいです。
何処を探しても見つからないようなものでなく、何処にでも転がっているものを
わざわざ覚える必要はありません。
必要に成ったらそのサイトを見ましょう。

エンジニアなら「何処にもないもの」を作り出す努力をしましょう。
それに、バイナリサーチを自分で書く必要って、あまり無いような気がする。

投稿2019/10/04 01:34

nob.

総合スコア711

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

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

y97

2019/10/08 10:45

わかりました。どこにもないものを作れるというのが重要なのですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問