さて、さっそく初回の記事になります。
この記事は、#1として、具体的なアルゴリズムを見る前の心構えなんかを記述していきます。
普段の開発からアルゴリズムを意識できるようにしたい。。。
そして、プレッシャーがかかった時に(最近ちょっと悔しい思いをしまして...)、
できるだけ頭を整理しながらコードを組み立てられるような思考なんかも合わせて勉強したいと思います。
なにごとも基礎を大事にということで笑
ちょっと今回は定性的なことが多い初回の記事かもしれませんが、よろしくお願い致します!
アルゴリズム (algorithm) とは?
いきなり引用ですが、アルゴリズムとは、
数学、コンピューティング、言語学、あるいは関連する分野において、問題を解くための手順を定式化した形で表現したものを言う。算法と訳されることもある。引用: アルゴリズム - Wikipedia
当たり前ですが、アルゴリズムはプログラミングの領域のみではなく、いろんな領域で用いられてるようです。
アルゴリズムは、問題を効率的に根拠を持って解決をするための手段といえるでしょう。
ちなみに、アルゴリズム(algorithm)という語は、9世紀イラクの数学者アル=フワーリズミーからきていると言われています。
人の名前が由来だったんだ...!!!!
アルゴリズムを活かす
私としては、とくに効率的というところに着目したいです。
エンジニアとしては、効率性が重視されると思います。
コードの高速化や何かの構成のシンプル化(= 効率的且つ冗長化されたときも効率的になるのか)など、活かせる場面は多々あります。
(ほとんどの)アルゴリズムは、コンピュータプログラムとして実装されることを意図しているそうです。
たしかにそれは納得できます。いろんな機器にせよ、専門的な分野のツールにせよ、プログラムが動いていますよね。そこで、アルゴリズムが使用され、より効率的に処理したりするわけです。
DVDの再生にせよ、ストリーミング再生にせよ、電車乗り換えアプリにせよ、ありとあらゆるところにアルゴリズムは存在しています。
多くの記事で、「アルゴリズムは、計算法!」みたいに記述されていますが、現代におけるアルゴリズムの厳密な定義としては、
【計算可能なもの】を計算する手続き
と、されている。
なんだか、こっちのほうがしっくりきます。仮に一時的に計算不可能?なものがあるとして、これを解こうとして、アルゴリズムを駆使する。って考えるとなんだか計算方法というよりか、手段であると納得します。
と、まあここらへんにして、アルゴリズムは一体どれだけの種類があるのでしょうか?
アルゴリズムの種類
パッと調べてみると、Wikipediaのこんなページを見つけました。
List of algorithms - Wikipedia
ものすごい沢山ありますねw
でも、安心してください。全部覚える必要はありません笑
ググって出てくる主要なアルゴリズムがあるので、それを優先して勉強していけば良さそうです。
ですが、もう少し調べてみることにします。
米メディア、mediumのTop algorithmの記事がありました。
ちょっと英語なので、アルゴリズムの名前が日本語とで呼び方が違うかもしれませんが、見慣れているアルゴリズムが多いでしょう。
主要なアルゴリズムは、次回以降の記事でおっていけたらと思います!
この記事をみると、Top Data Structures(データ構造)という項目もあります。
データ構造とはなんでしょうか?
Data Structure (データ構造)
データ構造は、データを効率よく扱うため、システマナイズ(あるパターンを持たせた)し格納する形式のことです。
配列やリストもこの1種になります。
わたしの経験から、このデータ構造は非常に重要だと思います。笑
大規模なシステムになると、長期的にみて、バグや冗長化困難なリスクを抱えたりします。
運用からジョインした人は、構造が悪ければ修正するべきですし、新規開発ではよく考慮して開発すべきだと思います。
データ構造の決定は、使用するアルゴリズムを決めたり、
または、アルゴリズムが決まれば、データ構造を定めることもできますね。
データ構造はアルゴリズムにも密接に関係してきますので、こちらも基本的なデータ構造もこのシリーズでおっていけたらと思います。
- 配列
- スタック - LIFO(Last In First Out)
- キュー - FIFO(First In First Out)
- 連想配列
- ハッシュテーブル
- ルックアップテーブル
- 線形リスト
- 木構造
- グラフ
アルゴリズムを勉強するモチベーション
これに関しては、アルゴリズムを学ぶのが好き!って人は読み飛ばしてください笑
アルゴリズムを学ぶにあたり、いろんな書籍や記事がありますが、
外部ライブラリを使用していたりして肝心な根本のロジックがわからない!とかよくあると思います。
また、○○やりたいのに前提となる数学の知識がけっこう必要...、そもそも数学が苦手…などなど、少し抵抗感がある人もいるかもしれません。
ですが、まずアルゴリズムを学ぶ上で、学ぶことによって得られるスキルを思い浮かべてみます。
1点目、日頃のタスクの改善に繋がるかも!
日頃、四苦八苦していたコードがあったとして、改善する策が増えることでタスクをこなす時間短縮できるかもしれません。
空いた時間で、さらに違う技術を勉強できるかも!
2点目、自作ライブラリ?笑
今まで普通に使用していた便利なライブラリがあるとして、そのライブラリを理解し、
拡張、または、自分で自作できるようになるかもしれません。
3点目、○○の視点がかわるかも?笑
いつもなんとなーく見ていた何かに気づきがあるかもしれません。笑
実はこれ、こういうパターンで成り立っているんだ!とかとか。
わたしは勉強をはじめて、数時間ほどで数に関しての考え方が少し変わりました!
アルゴリズムを学ぶことでってわけでもないですが、上記のようなことを想像して少しずつ勉強できたらいいと思います。
では、最後に少し準備していくことを簡単に!
準備&参考にしていくもの
こちらの過去記事から、進数の項目を参考にします。
書籍
珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造
サイト
- Problem Solving with Algorithms and Data Structures using Python — Problem Solving with Algorithms and Data Structures
- M.Hiroi's Home Page / Python3 Programming
GitHub - TheAlgorithms/Python: All Algorithms implemented in Python
では、初回はこれくらいにして、次回の記事のテーマは数学の体操にしようかと思います!笑
以上.