🐙

【図解】アルゎリズムずは初心者が知るべき基本抂念

に公開2件

プログラミングを孊ぶ䞊で避けお通れない「アルゎリズム」ずいう蚀葉。「なんだか難しそう 」ず感じる方も倚いのではないでしょうかこの蚘事では、アルゎリズムずは䜕か、なぜ重芁なのか、そしお基本的なアルゎリズムに぀いお、図解を亀えおわかりやすく解説したす。

アルゎリズムずは

簡単に蚀うず 

アルゎリズムずは、問題を解決するための手順や方法のこずです。料理のレシピや組み立お説明曞のようなもので、ステップバむステップで目暙を達成するための道筋を瀺したす。

䟋えば、「朝起きおから䌚瀟に行くたで」ずいうシンプルな行動も、以䞋のようなアルゎリズムで衚珟できたす

コンピュヌタプログラミングにおけるアルゎリズムも同じ考え方です。特定の問題を解決するための、明確で順序立おられた手順の集たりなのです。

アルゎリズムの特城

良いアルゎリズムには、以䞋のような特城がありたす

  1. 明確性各ステップが明確で曖昧さがない
  2. 有限性必ず終了する無限ルヌプにならない
  3. 入力0個以䞊の入力を受け取る
  4. 出力1個以䞊の出力を生成する
  5. 効率性リ゜ヌス時間・メモリなどを効率的に䜿甚する

なぜアルゎリズムが重芁なのか

アルゎリズムを孊ぶこずには、以䞋のようなメリットがありたす

1. 問題解決胜力の向䞊

アルゎリズム的思考を身に぀けるこずで、耇雑な問題を小さな郚分に分解し、効率的に解決する胜力が逊われたす。これはプログラミングだけでなく、日垞生掻のあらゆる堎面で圹立ちたす。

2. 効率的なコヌドの䜜成

同じ問題を解決するプログラムでも、アルゎリズムの遞択によっお実行速床やメモリ䜿甚量が倧きく倉わりたす。適切なアルゎリズムを遞ぶこずで、より効率的なプログラムを䜜成できたす。

3. 技術面接での評䟡ポむント

倚くのIT䌁業の採甚面接では、アルゎリズムの知識や問題解決胜力が評䟡されたす。基本的なアルゎリズムを理解しおいるこずは、就職・転職の際に倧きなアドバンテヌゞずなりたす。

アルゎリズムの衚珟方法

アルゎリズムを衚珟する方法はいく぀かありたすが、䞻に以䞋の3぀が䜿われたす

1. 自然蚀語日本語や英語など

最も基本的な衚珟方法で、普段䜿っおいる蚀葉でアルゎリズムを説明したす。

䟋「配列の䞭から最倧倀を芋぀けるには、たず最初の芁玠を最倧倀ずし、配列の各芁玠ず比范しおいき、より倧きな倀が芋぀かったら最倧倀を曎新する」

2. フロヌチャヌト流れ図

アルゎリズムの流れを芖芚的に衚珟する方法です。凊理の流れが䞀目でわかるため、理解しやすいずいう特城がありたす。

䟋最倧倀を芋぀けるアルゎリズムのフロヌチャヌト

3. 疑䌌コヌド擬䌌蚀語

プログラミング蚀語に䌌た圢匏で曞かれるが、特定の蚀語の文法に瞛られない蚘述方法です。アルゎリズムの本質を衚珟し぀぀、実装に近い圢で蚘述できたす。

䟋最倧倀を芋぀ける疑䌌コヌド

function findMax(array):
    if array is empty:
        return null
    
    max = array[0]
    for i from 1 to array.length - 1:
        if array[i] > max:
            max = array[i]
    
    return max

基本的なアルゎリズム

ここからは、プログラミング初心者が知っおおくべき基本的なアルゎリズムをいく぀か玹介したす。

1. 線圢探玢Linear Search

配列の䞭から特定の倀を探すシンプルなアルゎリズムです。先頭から順番に各芁玠をチェックしおいきたす。

図解

疑䌌コヌド

function linearSearch(array, target):
    for i from 0 to array.length - 1:
        if array[i] equals target:
            return i  // 芋぀かった䜍眮を返す
    
    return -1  // 芋぀からなかった

特城

  • 時間耇雑床: O(n) - 最悪の堎合、配列の党芁玠を調べる必芁がある
  • 空間耇雑床: O(1) - 远加のメモリをほずんど䜿甚しない
  • メリット: シンプルで実装が容易、配列が゜ヌトされおいなくおも䜿える
  • デメリット: 倧きな配列では効率が悪い

2. 二分探玢Binary Search

゜ヌト枈みの配列で䜿える効率的な探玢アルゎリズムです。配列の䞭倮の倀ず探したい倀を比范し、探玢範囲を半分に絞っおいきたす。

図解

もう少し耇雑な䟋

疑䌌コヌド

function binarySearch(array, target):
    left = 0
    right = array.length - 1
    
    while left <= right:
        mid = (left + right) / 2
        
        if array[mid] equals target:
            return mid  // 芋぀かった䜍眮を返す
        else if array[mid] < target:
            left = mid + 1  // 右半分を探玢
        else:
            right = mid - 1  // 巊半分を探玢
    
    return -1  // 芋぀からなかった

特城

  • 時間耇雑床: O(log n) - 各ステップで探玢範囲が半分になる
  • 空間耇雑床: O(1) - 远加のメモリをほずんど䜿甚しない
  • メリット: 倧きな配列でも効率的に探玢できる
  • デメリット: 配列が゜ヌトされおいる必芁がある

3. バブル゜ヌトBubble Sort

最も基本的な゜ヌトアルゎリズムの䞀぀です。隣接する芁玠を比范し、必芁に応じお亀換するこずで、埐々に倧きな倀を「泡」のように右偎に移動させおいきたす。

図解

疑䌌コヌド

function bubbleSort(array):
    n = array.length
    
    for i from 0 to n - 1:
        for j from 0 to n - i - 1:
            if array[j] > array[j + 1]:
                // 芁玠を亀換
                swap array[j] and array[j + 1]
    
    return array

特城

  • 時間耇雑床: O(n²) - 二重ルヌプを䜿甚
  • 空間耇雑床: O(1) - 远加のメモリをほずんど䜿甚しない
  • メリット: シンプルで実装が容易、小さな配列では効率的
  • デメリット: 倧きな配列では非垞に効率が悪い

4. クむック゜ヌトQuick Sort

「分割統治法」を甚いた効率的な゜ヌトアルゎリズムです。ピボット基準倀を遞び、それより小さい芁玠ず倧きい芁玠に分割し、再垰的に゜ヌトしおいきたす。

図解

疑䌌コヌド

function quickSort(array, low, high):
    if low < high:
        // ピボットを遞び、配列を分割
        pivotIndex = partition(array, low, high)
        
        // ピボットの巊偎を゜ヌト
        quickSort(array, low, pivotIndex - 1)
        
        // ピボットの右偎を゜ヌト
        quickSort(array, pivotIndex + 1, high)
    
    return array

function partition(array, low, high):
    pivot = array[high]  // 最埌の芁玠をピボットずしお遞択
    i = low - 1
    
    for j from low to high - 1:
        if array[j] <= pivot:
            i = i + 1
            swap array[i] and array[j]
    
    swap array[i + 1] and array[high]
    return i + 1

特城

  • 時間耇雑床: 平均 O(n log n)、最悪 O(n²)
  • 空間耇雑床: O(log n) - 再垰呌び出しのためのスタック領域
  • メリット: 平均的には非垞に効率的、実甚的な゜ヌトアルゎリズム
  • デメリット: 最悪の堎合既に゜ヌトされおいる配列などは効率が悪い

5. 再垰アルゎリズムRecursion

再垰ずは、関数が自分自身を呌び出す手法です。倚くの問題を簡朔に解決できたすが、理解するのが少し難しいかもしれたせん。

䟋階乗の蚈算

階乗n!は、1からnたでの敎数の積です。䟋えば、5! = 5 × 4 × 3 × 2 × 1 = 120

再垰を䜿った階乗の蚈算は以䞋のように衚珟できたす

  • 0! = 1 基本ケヌス
  • n! = n × (n-1)! n > 0の堎合

図解

疑䌌コヌド

function factorial(n):
    // 基本ケヌス
    if n equals 0 or n equals 1:
        return 1
    
    // 再垰ケヌス
    return n * factorial(n - 1)

特城

  • メリット: 耇雑な問題を簡朔に衚珟できる
  • デメリット: スタックオヌバヌフロヌの可胜性がある、理解しにくい堎合がある

アルゎリズムの効率性

アルゎリズムの効率性を評䟡する際、䞻に以䞋の2぀の芳点から考えたす

1. 時間耇雑床Time Complexity

アルゎリズムの実行時間がどのように増加するかを衚したす。入力サむズnに察しお、O(n)、O(n²)、O(log n)などで衚珟したす。

  • O(1): 定数時間入力サむズに関係なく䞀定
  • O(log n): 察数時間二分探玢など
  • O(n): 線圢時間線圢探玢など
  • O(n log n): 線圢察数時間効率的な゜ヌトアルゎリズムなど
  • O(n²): 二次時間バブル゜ヌトなど
  • O(2^n): 指数時間総圓たり探玢など

2. 空間耇雑床Space Complexity

アルゎリズムが䜿甚するメモリ量がどのように増加するかを衚したす。

  • O(1): 定数空間远加のメモリをほずんど䜿甚しない
  • O(n): 線圢空間入力サむズに比䟋したメモリを䜿甚
  • O(n²): 二次空間二次元配列など

実践的な䟋アルゎリズムを䜿った問題解決

ここでは、アルゎリズムを䜿っお実際の問題を解決する䟋を玹介したす。

䟋題最頻倀モヌドを求める

配列の䞭で最も頻繁に出珟する倀最頻倀を求めるアルゎリズムを考えおみたしょう。

解法

  1. 各芁玠の出珟回数を数える
  2. 最も出珟回数が倚い芁玠を芋぀ける

疑䌌コヌド

function findMode(array):
    if array is empty:
        return null
    
    // 各芁玠の出珟回数を数える
    countMap = empty map
    for each element in array:
        if element exists in countMap:
            countMap[element] = countMap[element] + 1
        else:
            countMap[element] = 1
    
    // 最頻倀を芋぀ける
    maxCount = 0
    mode = null
    
    for each (element, count) in countMap:
        if count > maxCount:
            maxCount = count
            mode = element
    
    return mode

JavaScript実装

function findMode(array) {
  if (array.length === 0) return null;
  
  // 各芁玠の出珟回数を数える
  const countMap = {};
  for (const element of array) {
    countMap[element] = (countMap[element] || 0) + 1;
  }
  
  // 最頻倀を芋぀ける
  let maxCount = 0;
  let mode = null;
  
  for (const element in countMap) {
    if (countMap[element] > maxCount) {
      maxCount = countMap[element];
      mode = element;
    }
  }
  
  return mode;
}

// 䜿甚䟋
const numbers = [1, 2, 3, 2, 2, 4, 5, 3, 2];
console.log(findMode(numbers));  // 2

アルゎリズムを孊ぶためのリ゜ヌス

アルゎリズムをさらに孊びたい方のために、おすすめの日本語リ゜ヌスをいく぀か玹介したす

1. 日本語のオンラむンプラットフォヌム

  • Paiza: 実践的なプログラミング問題が豊富で、スキルチェックも可胜
  • AtCoder: 競技プログラミングのコンテストが定期的に開催される
  • ドットむンストヌル: 短い動画で基本的なアルゎリズムを孊べる
  • Progate: 初心者向けのむンタラクティブな孊習プラットフォヌム

2. 曞籍

  • 『アルゎリズム図鑑』 石田保茝、宮厎修䞀 著
  • 『䞖界で闘うプログラミング力を鍛える150問』 Gayle Laakmann McDowell 著
  • 『問題解決力を鍛えるアルゎリズムずデヌタ構造』 倧槻兌資 著

3. 日本語のYouTube チャンネル

  • キノコヌド: アルゎリズムやデヌタ構造を日本語でわかりやすく解説
  • したぶヌのIT倧孊: プログラミングの基瀎からアルゎリズムたで幅広く解説
  • Tomoaki Takezoe: アルゎリズムの解説や競技プログラミングのテクニックを玹介
  • JMOOC 攟送倧孊: 倧孊レベルのアルゎリズム講座が公開されおいる

たずめ

この蚘事では、アルゎリズムの基本抂念から、代衚的なアルゎリズム、そしお効率性の評䟡方法たで幅広く解説したした。

アルゎリズムは、プログラミングの基瀎であり、効率的なコヌドを曞くための重芁な知識です。䞀床にすべおを理解しようずせず、少しず぀実践しながら身に぀けおいくこずをおすすめしたす。

特に初心者の方は、以䞋のステップで孊習を進めるずよいでしょう

  1. 基本的なアルゎリズム線圢探玢、バブル゜ヌトなどを理解する
  2. 簡単な問題を解きながら、アルゎリズム的思考を身に぀ける
  3. より効率的なアルゎリズム二分探玢、クむック゜ヌトなどを孊ぶ
  4. 実際のプロゞェクトでアルゎリズムを掻甚する

アルゎリズムの孊習は䞀朝䞀倕にはいきたせんが、基本を抌さえお継続的に孊ぶこずで、プログラミングスキルは確実に向䞊したす。

Discussion

junerjuner

zenn は mermaid 蚘法サポヌトしおいるみたいなのでフロヌチャヌトはそっちにしおみた方がよいかも  
https://zenn.dev/team_zenn/articles/zenn-mermaid-js

宝束@システム゚ンゞニア宝束@システム゚ンゞニア

✹ ご指摘ありがずうございたすZenn で mermaid 蚘法が䜿えるのは知りたせんでした。
せっかくなので、今埌の蚘事では mermaid を掻甚しおみたすね
貎重なフィヌドバック、助かりたす🙏

1