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

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

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


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

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

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

アルゴリズムとは?

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

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

アルゴリズムを学ぶ理由

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

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

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

近年特に重要視されるアルゴリズム学習

近年特にアルゴリズムを学ぶことが重要視されています。そこにはいくつかの理由があります。

技術の進歩とデジタルトランスフォーメーション

現代社会における技術の進歩はめざましく、ますます多くの業界や領域においてアルゴリズムが重要な役割を果たしています。アルゴリズムはデータ処理や問題解決の手法を提供し、ビジネスプロセスやシステムの最適化、分析、予測、パターン認識などを可能にします。

データの爆発的な増加

インターネットやセンサー技術の発展により、私たちの周りには膨大な量のデータが生成されるようになりました。これらのデータから有用な情報を抽出し、洞察を得るためには、効果的なアルゴリズムを開発する必要があります。アルゴリズムを学ぶことで、データの分析や処理方法を理解し、価値ある知識を獲得できます。

人工知能(AI)と機械学習の進展

アルゴリズムは人工知能(AI)や機械学習の基盤となる重要な要素です。機械学習アルゴリズムを理解し、適切に選択・実装することで、データからパターンを学習し、予測モデルや分類器を構築することができます。また、AIの倫理やバイアスの問題にも対処するために、アルゴリズムの理解と適切な設計が重要です。

問題解決力と論理思考を養う

アルゴリズムを学ぶことは、論理思考や問題解決能力を養う上で非常に有益です。アルゴリズムは、複雑な問題を分解し、効率的な手順を設計するための道具です。アルゴリズムを学ぶことで、問題解決のスキルや創造性が向上し、日常生活や職業上のさまざまな課題に対処する能力が高まります。

このようにアルゴリズムの学習は現代社会において重要なスキルであり、個人や組織の成果や競争力を向上させるために不可欠な要素となっています。

アルゴリズムの例

よく使われるアルゴリズムの例として「ソート(並べ替え)」があります。例えば「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では、エンジニアの方向けに勉強会・イベント情報を提供しています。 ご興味のある方はぜひご参加ください。

TECH PLAYでは、ITに関わる様々なイベント・勉強会・講演会・交流会・カンファレンス・セミナーなどの情報を集約し掲載しています。

テクノロジーと共に成長しよう、
活躍しよう。

TECH PLAYに登録すると、
スキルアップやキャリアアップのための
情報がもっと簡単に見つけられます。

面白そうなイベントを見つけたら
積極的に参加してみましょう。
ログインはこちら

タグからイベントをさがす