見出し画像

JavaScriptで学ぶアルゴリズム①[アルゴリズム基礎と線形探索]

外資系企業でソフトウェアエンジニアをしております、タロイモと言います。今日もよろしくお願いします。

今回から複数回に分けてアルゴリズムの勉強をしていきます。

第一回では「アルゴリズムとは何か」とO(1)、O(n)アルゴリズムを扱います。

アルゴリズムとは

そもそもアルゴリズムとはなんでしょうか。

アルゴリズムは計算方法と言えるでしょう。


国立情報学研究所の説明がすごく分かりやすかったので、
要約して紹介します。

参考:国立情報学研究所

人参で例えると、1本の人参を星形に30個に切るアルゴリズムは以下の2通りあるとします。

スクリーンショット 2020-08-19 19.40.52

①一度30個に切って、星形に切る。

②一度星形に切って、30個に切る。

上記の2つはどちらが速いでしょうか。

当然、②ですよね。
②は、最初に一気に星形に切れば、あとは31個にするだけです。

(最初に包丁を10回通して、端っこを落とすために2回包丁を通し、29回人参に包丁を通すため、合計41回)

反対に①は、最初に30個に切ったら、それらを一個ずつ星形にする必要があります。

(最初に端っこを落とすために2回包丁を通し、29回人参に包丁を通す、一個の人参を星形にするために10回包丁を通し、それが×30なので、合計331回)

単純計算で、①は②の8倍近い時間がかかることになります。


コンピュータはとても計算が速いため、8倍だったらそんなに違いは感じられないでしょう。

しかし、それが100倍、1000倍、10000倍となるととんでもない時間になってしまいます。

このようにアルゴリズム(計算方法)を考え、計算実行時間を短くすることはとても大切なことです。


O(1)

O(1)のOは、O記法(オーダー記法)と呼ばれ、計算にかかる時間とデータの量の関係について表しています。

O(n)内のnにデータを与えた場合、そのアルゴリズムはどのくらいの時間がかかるかを表しています。

O(1)はnがありません。つまりどんなにデータが増えても計算は1回になります。

以下の関数にどんな言葉を入れても計算は1回だけなので、この関数はO(1)になります。
言葉の長さは関係ありません。

function greet(word) {
    console.log(word);
}

greet("こんにちは世界"); 
greet("hello world");
greet("おやすみなさい");


O(n)

O(n)は、データnが増えれば増えると、そのデータの数だけ計算量が増えていきます。

O(n)は線形探索とも呼ばれます。

一列のデータ(線)を1つずつ調べていくことが由来です。

function linear_search(key, array) {
   for (let i = 0; i < array.length; i++) {
       if (array[i] === key) {
          console.log(`${key} は存在します。`);
       }
   }
}

let array = [1, 2, 5 ,7, 8, 10, 11, 18, 21]; 

linear_search(2, array); //2は存在します。 
linear_search(3, array); //(出力なし)
linear_search(13, array); //(出力なし)

function linear_searchの中のfor文は、配列の長さ(array.length)の分だけデータを調べるので、配列が長くなるにつれて計算量が増えます。

今回では配列の長さがnに当てはまるので、n = 9となります。


今回はアルゴリズムとは何かについて、そして簡単なアルゴリズムについてO記法(オーダー記法)で紹介しました。

ご精読ありがとうございました。

よろしければサポートお願いします! サポートは、サービスの開発・改良や、記事を書く際の素材費とさせていただきます。 少しでも有益な情報発信をしていけるよう努めてまいります。 是非とも応援よろしくお願いします!!!🙇‍♂️