アルゴリズムとは何か?アルゴリズムの意味を理解してもっと楽しく学ぼう!

トレンド
プログラミング アルゴリズム
アルゴリズムとは何か?アルゴリズムの意味を理解してもっと楽しく学ぼう!

アルゴリズムとはどんなことでしょう?最近では「Googleの検索順位で上位に表示されるアルゴリズム」などのように、一般の人が目にする機会も増えています。アルゴリズムの意味を正確に理解し、もっと楽しくプログラミングを学びましょう。
本記事ではアルゴリズムとは何か、ということを解説し、簡単な問題を解く例を出題しています。また、連載を通して効率よく処理できるプログラムを作成するときに役立つ考え方を紹介します。


プログラミングを学ぶとき、合わせてアルゴリズムを学ぶ人は多いと思います。アルゴリズムに関する書籍を読むと、ソートや探索などの基本的な内容がどの本にも載っています。学校で学ぶ場合も、必ず教えられるアルゴリズムでしょう。

ソートのアルゴリズムの場合、挿入ソートや選択ソートから始まり、クイックソートやマージソートなど、工夫した処理を学びます。探索の場合も、線形探索だけでなく二分探索や文字列探索、深さ優先探索や幅優先探索などは避けて通れません。

ただ、その勉強がつまらないと感じる人は少なくありません。最近のプログラミング言語はライブラリとしてソートや探索を用意していることが多く、実務の現場では一から実装することはほとんどありません。実際、下手に実装するよりも、用意されている関数を使う方が高速に処理できることも少なくありません。今回はアルゴリズムをもっと楽しく学べるヒントとコツを紹介します。

アルゴリズムとは?

そもそもアルゴリズムとは、「問題を解決するための手順や計算方法」を指す言葉です。「算法」と呼ばれることもありますが、答えを求めるときの手順を具体的かつ明確に示したものだと言えます。つまり、アルゴリズムとは、その手順に沿っていれば誰でも同じ答えが得られるものを指します。

ただ、一般にアルゴリズムとはコンピュータを使ってプログラムで問題を解決するための手順を表す言葉として使われます。コンピュータは大量の単純な計算を高速に処理できますが、その処理手順を少し変えるだけで処理時間が大幅に短縮できる場合があるのです。これがアルゴリズムに注目が集まる理由です。

アルゴリズムを学ぶ理由

基本的なアルゴリズムを学ぶ理由として、自分自身で実装してみることで、プログラミング言語に慣れるという意味もあります。変数や配列、ループや条件分岐など、プログラミングの基礎となる要素がソートや探索には詰まっています。これらを学ぶことで、データ構造についても学ぶことができます。

また、計算量の考え方を理解する上では最適だという面があります。設計によって処理速度が大きく変わることを体験することで、アルゴリズムの選択が重要だということを理解できます。

実務の現場でも、データ量が少ないうちは遅いアルゴリズムで問題なくても、データ量が増えたときに処理に時間がかかると、その重要性を再認識します。

アルゴリズムの例

よく使われるアルゴリズムの例として「ソート(並べ替え)」があります。例えば「4, 3, 5,1,6,2」という数値のデータが与えられたとき、これを「1, 2, 3, 4, 5, 6」のように昇順に並べ替える処理です。その手順として、最小の値を選んで先頭に移動させる「選択ソート」や、隣同士の数を交換しながら移動させる「バブルソート」などが「遅い」アルゴリズムの例として有名です。同じ結果が得られるアルゴリズムでも、データを分割して統合する「マージソート」や、基準となる値を選んで比較する「クイックソート」などが「速い」アルゴリズムの例として知られています。

プログラミングの目的は課題解決

ただ、仕事としてプログラミングを使う場合、ソートなどのアルゴリズムを学ぶだけでは、何の問題も解決していません。処理を高速化する、という意味では効果が目に見えて現れるのですが、本来の目的はビジネス面の課題を解決したいのであって、高速化だけをやりたい人はなかなかいないと思います。

仕事としてプログラミングを使う理由の多くは「顧客の課題を解決する」「仕事を自動化して楽になる」など、何か実現したいことであって、プログラミングはその手段です。もちろん、学生の場合は「将来のために」「パソコンを使えて楽しそう」など「プログラミングを学ぶこと」が目的になっている場合もあります。

ただ、プログラミングを目的ではなく手段だと考えると、アルゴリズムを学んでいるときに何かモヤっとしたものを感じる人は多いのではないでしょうか?

パズルを解いて楽しむ

最近、競技プログラミングを楽しむ人が多いのは、この「課題解決を楽しめる」というのも一つの理由かもしれません。与えられた問題を誰よりも速く解く、スマートな解法を見つける、高速なアルゴリズムを見つける、短いソースコードで実装する、など人によって楽しみ方は様々ですが、プログラミングによって「問題を解く」「課題を解決する」という行為は楽しいものです。

そして、これは最近話題の「プログラミング教育」にもつながります。2020年から小学校でプログラミング教育が義務化することもあり、多くの書籍が書店に並んでいますが、「プログラミング」という授業が増えるわけではなく、各教科の中での課題を、プログラミングを使って解決することが目的です。

こどもたちが「プログラミング的思考」を学ぶときにも、ソートや探索などよりも、パズルのように興味を持ちやすいものを使えると楽しんでもらえそうです。(プログラミング教育はコーディングを覚えることが目的ではありませんが)

パズルを解くアルゴリズムは昔からあった

ただ、アルゴリズムという言葉を聞くと、難しそうだと感じる人も多いでしょう。また、アルゴリズムはプログラミングの一部だと考えている人もいます。しかし、アルゴリズムは現代のコンピュータが登場するずっと前から存在していました。アルゴリズムは手順を考えることだと言えます。

例えば、「魔方陣」は数千年前からあったと言われています。魔方陣は縦、横、斜めのいずれもその和が同じになるようにマスに一つずつ数を配置するものです。3×3の魔方陣の場合、1〜9までの数を以下のように配置したものが挙げられます。



当時は占いなどに使われていたのかもしれませんが、現在はパズルとして楽しまれたり、大きな魔方陣を探したり、といったことに使われています。魔方陣以外にも、アルゴリズムは「問題を解く手順の定式化」であって、プログラミングだけのものではありません。

パズルをどうやって解くか

多くのパズルは理論的には全探索すれば答えを見つけられるはずです。魔方陣の場合は、左上から順に数を当てはめていき、右下まですべてのマスが埋まれば探索できます。五目並べやリバーシ、囲碁や将棋のようなゲームでも、全探索すればどちらが勝つか分かります。

ただ、膨大な量を探索する必要があり、現実的な時間で解けない、という問題があります。そこで、いくつかの工夫を行うことが考えられます。

例えば、探索する範囲を数手先までに制限する方法、盤面を評価して不利な手は探索しないように枝刈りする方法、一度探索したものは記録しておき同じ場面が出た時に再探索しないようにする方法、などいくつも考えられます。

解き方はいくつも存在しますし、それを考えるのが醍醐味だと言えます。同じ問題を解くときも、より効率よく解く方法はないか考えます。短時間で答えを求められる方法、メモリ使用量が小さい方法、実装が容易な方法、などその評価も色々です。もしかすると、プログラムを作らなくても数学的に計算して答えを見つけられるかもしれません。

この連載での目的

上記のように、アルゴリズムを学ぶときも、パズルを解くのと同じように、楽しみながら解けると取り組みやすくなるのではないか、と考えています。

そこで、この連載では、毎月1回問題を出題し、次回にその解答や解説、アルゴリズムの紹介を行うことを予定しています。問題を解く速さを競うわけではありませんが、解いた方は自由にオリジナルの解答を公開していただいて構いません。


【今月の問題】
3×3の魔方陣は1〜9までを一つずつ配置したものですが、n〜n+8を配置したものを求めるプログラムを作成してください。例えば、n=1の時は上記の例、n=2の時は以下のような例が生成できます。
ここで、nは1以上10以下の整数とします。


このように、できるだけ理解が簡単な問題で、誰でもイメージしやすいものを想定しています。少しは手作業で試すことができますが、数が大きくなるとプログラムを作らないと解けない、面倒な問題を想定しています。

プログラミングができなくても、ぜひ少し手元で試してみて、どうやって解くと効率が良いのか、考えてみてください。


(著者プロフィール)

WRITING:増井 敏克(マスイ トシカツ)

増井技術士事務所 代表。技術士(情報工学部門)、テクニカルエンジニア(ネットワーク、情報セキュリティ)、その他情報処理技術者試験に多数合格。また、ビジネス数学検定1級に合格し、公益財団法人日本数学検定協会認定トレーナーとしても活動。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援を行っている。 著書に『エンジニアが生き残るためのテクノロジーの授業』『おうちで学べるセキュリティのきほん』『プログラマ脳を鍛える数学パズル』『もっとプログラマ脳を鍛える数学パズル』『図解まるわかり セキュリティのしくみ』(翔泳社)、『プログラミング言語図鑑』『シゴトに役立つデータ分析・統計のトリセツ』(ソシム)がある。


イラスト:矢島 光(やじま ひかる)

漫画家。慶應義塾大学SFC在学時、講談社「MANGA OPEN」にて奨励賞を受賞。 2012年に株式会社サイバーエージェントへフロントエンジニアとして新卒入社、2015年退職、漫画家としての活動を開始し、新潮社ROLAにて「彼女のいる彼氏」にて初連載。

Official HP:http://yajimahikaru.strikingly.com/
Twitter:https://twitter.com/hikarujoe


次回テーマ

【第二回】複数の解き方を考えて実装してみよう! #パズルのアルゴリズム問題


TECH PLAYでは、エンジニア向けに プログラミングアルゴリズム に関する勉強会・イベント情報を提供しております。ご興味のある方はぜひ参加ください。