BLOGブログ

IT研修

  • このエントリーをはてなブックマークに追加

プログラミング言語を学ぶなら「アルゴリズムとデータ構造」から学ぶのが近道です

「プログラミングを学びたい!」と勢い込んで本を買ったり、学習サイトを見て勉強を始めて見たけど、「よく分からない!」となって挫折してしまった方は結構おられると思います。

IT初心者が、プログラミング学習に挫折してしまうポイントは幾つかありますが、本人のやる気以外では学習する教材に大きな問題があるケースが往々にしてあります。

そういった教材では、プログラミング言語を学ぶ上で重要な「アルゴリズムとデータ構造」と「プログラミング言語の文法」を同時に理解させようとすることが多いのですが、これは結構難しい話でそのために「プログラミングは向いていない」となってしまうのです。

では、どのような形でプログラミングを学んで行くのがいいのでしょうか?

それは、まず最初に「アルゴリズムとデータ構造」を理解して、その後に「プログラミング言語の文法」を学ぶ、というのが実はプログラミング理解の近道なのです。

見出し

「アルゴリズムとデータ構造」とは何か?

「アルゴリズム」とは、ある問題を解決するために実施する手順を定式化した形で表現したものです。

これは、簡単に言うと「何を」「どのように」「どのような順番で」「何に対して」実施するのかを記述したものになります。

例えば、あなたが初めてカレーを作る場合には、本やWebサイト等に載っているレシピを参照すると思いますが、レシピは「使用する材料の名前」「分量」「材料を調理する方法と順番」から構成されています。

curry

カレーを作る場合、まずは肉、ジャガイモ、玉ねぎ、人参、カレー粉といった材料を決められた分量だけ用意し、切る、炒める、水を入れる、加熱する、といった調理を決められた順番に従って料理を作り上げるのが、特に料理の初心者にとって重要です。

curry_flow

この、レシピがプログラミングで言う「アルゴリズムとデータ構造」になります。

カレーは、レシピ通りの分量と手順で作れば、誰もがカレーを作る事ができるようになりますが、「アルゴリズムとデータ構造」はある問題を解決するための方法と手順を正確に書き記したものである、と言い換える事ができます。

上では料理を使って「アルゴリズムとデータ構造」について説明をしましたが、木を使って梯子を組み立てる、折り紙で鶴を折る、といった世の中のありとあらゆるものが、正しい方法と手順に従って行う、つまり「アルゴリズムとデータ構造」が明確であれば、誰でも同じ事ができるようになります。

因みに、料理が下手な人の中には、レシピに従わず材料や分量、順番を適当にしていることが多くあります。こういった人はレシピに従うことの重要性を認識しない限り、料理がなかなか上達しません。

翻って、プログラミングにおいては、「使用する材料の名前」と「分量」が入力される「データ」であり、「材料を調理する方法と順番」がどのような処理をどのような順番で行う、という「アルゴリズム」にあたります。

カレーは、レシピ通りの分量と手順で作れば、誰もがカレーを作る事ができますが、プログラミングでも「アルゴリズムとデータ構造」があれば、誰でも同じようにプログミングができるようになります。

このように、「アルゴリズムとデータ構造」は料理におけるレシピのように、プログラミングにおいて非常に重要なものであり、互いに切っても切り離せないものなのです。

アルゴリズムとは

料理を例にプログラミングにおける、「アルゴリズムとデータ構造」の重要性について説明をしましたが、次は「アルゴリズム」についてもう少し詳しく見ていきたいと思います。

「アルゴリズム」とは、上で述べたように料理においては「材料を調理する方法と順番」ですが、プログラムとの関係で考えるとどういったものでしょうか?

例えば、ASCII.jpデジタル用語事典では、以下のように書いてあります。

問題を解決するための方法や手順のこと。問題解決の手続きを一般化するもので、プログラミングを作成する基礎となる。アルゴリズムは1つの問題に対し、複数ある場合が多い。たとえば、文字をアルファベット順に並べ替えるには、複数のアルゴリズムが考えられる。

つまり、問題を解く「解法」がアルゴリズムであるという事です。

無料のプログラミングレッスンを受けられることが出来て、教育機関を対象にプログラミングの授業を増やすことを推進する運動を行っているアメリカのCode.orgでは、「アルゴリズム」を教えるためにGraph Paper Programming(PDF)というものを用意しています。

Graph Paper Programming(方眼紙プログラミング)

「Graph Paper Programming(方眼紙プログラミング)」では、左端から順番に移動して方眼紙を塗りつぶして絵を描きます。

例えば、以下のように互い違いに方眼紙を塗りつぶした図形を描く事を考えてみましょう。

パターン1
パターン1

左上の星印の位置からスタートして、順番に移動しながら塗りつぶしていくのですが、その場合には以下のような行動の組み合わせで動くようにして考えてみます。

GPP_Algorithm

その場合、「パターン1」のように塗りつぶして最後のマス目まで行く際には以下のように動く必要があります。

・右に一つ移動
・塗りつぶし
・右に一つ移動
・下に一つ移動
・塗りつぶし
・左に一つ移動
・左に一つ移動
・塗りつぶし
・下に一つ移動
・右に一つ移動
・塗りつぶし
・右に一つ移動

これを画像で見ると、このようになります。

Graph_Paper_Programming_3

また、移動の手順だけ並べる以下のようになります。

Graph_Paper_Programming_4

この塗り方の手順が「アルゴリズム」であり、矢印の記号が「プログラム」でいうコードになり、「アルゴリズム」をコンピュータに読めるようにすると「プログラム」になります。

このような「アルゴリズム」があれば、誰でも同じ図形を描く事ができますよね。

また、この「アルゴリズム」では「右に一つ移動」から始めましたが、「下に一つ移動」から始めてもこの図形は描けます。

さらに、今回は最短距離で図形を描く方法を考えましたが、同じ所を何度もいったりきたりする非効率な方法でも描く事は出来ます。

つまり、別の「アルゴリズム」でも図形が描けますし、「アルゴリズム」を知らないと非効率になる事がここから理解できると思います。

このように、「アルゴリズム」とは「Graph Paper Programming(方眼紙プログラミング)」の場合には絵を描くための最適な「解法」になりますが、実際のプログラミングにおいても、この「アルゴリズム」を知っていると効率的にプログラミングができるのです。

データ構造とは?

次は、「データ構造」について見てみましょう。

「アルゴリズムとデータ構造」とは何か?では、レシピは「使用する材料の名前」「分量」「材料を調理する方法と順番」から構成されていて、「使用する材料の名前」と「分量」が「データ」にあたる、というように、「データ」についてはすでに説明しました。

これに対して、「データ構造」とは大量の「データ」を効率よく処理するための仕組みのことを言います。

今度は、レシピが大量に掲載されているレシピサイトで考えて見ましょう。

クックパッド

一般的なレシピサイトは、「鶏肉」、「豚肉」といった食材での分類や、「前菜」、「主菜」、「デザート」といった目的に応じた分類、「和食」、「フレンチ」、「イタリアン」といったジャンルでの分類というように、いくつかの分類でレシピが掲載されています。

data_structure

こうすることにより、必要なレシピを簡単に探し出せるようになっていますが、このレシピが簡単に探し出せる仕組みが「データ構造」なのです。

レシピの場合は、食材やジャンルに分けるのが便利ですが、マイナンバーといった個人情報を管理する場合には、名前、生年月日、郵便番号、住所といったものがセットになった「データ構造」が望ましいです。

また、図書館に行くと本の背表紙にラベルが貼ってあるのに気が付くと思いますが、これも「データ構造」です。

これは、日本十進分類法(NDC)という分類でラベルが構成されていて、これを知っていると広い図書館の中でも本を簡単に探し出せます。

library_ndc

詳しくは、こちらのはつかいち市民図書館:図書館お役立ちページ(青少年向け)をご覧頂ければと思いますが、このように「データ構造」を使う事で、日常生活の中でも便利さを実感できるのです。

プログラミングは身近な所に存在する

このように、「アルゴリズムとデータ構造」というのは、日常の中にも当たり前のように存在する考え方であり、知っていると非常に便利で、理解する事も実は難しくありません。

しかし、「アルゴリズムとデータ構造」を理解していると、プログラミング言語を学び始めた時にすんなりと理解できると思いますし、世の中にある「Java」「PHP」「Ruby」「Python」といったあらゆるプログラミング言語に共通で使える「考え方」なので、ここから身につけると、プログラミングを学ぶ上で大変楽になるのです。

前編:プログラミング言語を学ぶなら「アルゴリズムとデータ構造」から学ぶのが近道です
中編:プログラミングの「アルゴリズムとデータ構造」を学ぶには「Scratch」を使えば挫折が防げます

ランキング

最近の投稿

アーカイブ

カテゴリー

RSS