アルゴリズムはあくまで先人たちの知恵です。
確かにソートやサーチができますが、それはすでに言語やライブラリが提供しています。
よって、自分で組むことはまれ。
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 )...
という風に使い分けができる。
そういう、「弱みや強みを理解し、使い分けができる」っていう利点もあるっちゃあるね。