アルゴリズム一覧:コンピュータが問題を解く「手順」を完全網羅

プログラミング・IT

スマホのアプリ、ゲーム、検索エンジン、AI──私たちが毎日使うすべてのソフトウェアには「アルゴリズム」が隠れています。

でも「アルゴリズムって何?」と聞かれたら、すぐに答えられますか?
簡単に言えば、アルゴリズムとは「問題を解くための手順」のこと。料理のレシピや道案内のようなものですね。

実は、アルゴリズムの歴史は紀元前300年のユークリッドの時代まで遡ります。そして2000年以上の時を経て、現代では人工知能を動かす最先端のアルゴリズムまで発展してきました。

この記事では、コンピュータサイエンスの基盤となる主要なアルゴリズムを、初心者にもわかりやすく網羅的にご紹介します。

スポンサーリンク
  1. アルゴリズムって何?
    1. 基本的な意味
    2. 名前の由来
    3. なぜアルゴリズムが大切なの?
  2. アルゴリズムの速さを表す方法
    1. Big-O記法とは
    2. 主な計算量の種類
  3. ソートアルゴリズム──並び替えの技術
    1. 基本的なソート(初心者向け)
    2. 実用的なソート(現場で使われる)
    3. 特殊な状況で使えるソート
    4. どのソートを使えばいい?
  4. 検索アルゴリズム──探し物をする技術
    1. 線形探索(リニアサーチ)
    2. 二分探索(バイナリサーチ)
    3. 補間探索
    4. ハッシュテーブル
  5. グラフアルゴリズム──つながりを探る技術
    1. 探索アルゴリズム
    2. 最短経路アルゴリズム
    3. 最小全域木アルゴリズム
  6. 動的計画法──答えを覚えておく技術
    1. ナップサック問題
    2. 最長共通部分列(LCS)
    3. 編集距離(レーベンシュタイン距離)
  7. 分割統治法──大きな問題を小さく分ける技術
    1. カラツバ乗算法
    2. シュトラッセンの行列乗算
  8. 文字列アルゴリズム──文字の中から探す技術
    1. パターンマッチング
    2. 特殊なデータ構造
  9. 暗号化アルゴリズム──情報を守る技術
    1. 現在推奨される暗号化方式
    2. AES(Advanced Encryption Standard)
    3. RSA
    4. 楕円曲線暗号(ECC)
    5. ハッシュ関数
  10. 圧縮アルゴリズム──データを小さくする技術
    1. 可逆圧縮(ロスレス)
    2. 非可逆圧縮(ロッシー)
  11. 機械学習アルゴリズム──コンピュータが学習する技術
    1. 教師あり学習
    2. 深層学習(ディープラーニング)
    3. 強化学習
    4. 最適化アルゴリズム
  12. その他の重要なアルゴリズム
    1. ユークリッドの互除法
    2. 高速フーリエ変換(FFT)
    3. ブルームフィルタ
    4. Union-Find(素集合データ構造)
    5. LRUキャッシュ
  13. まとめ:アルゴリズムの世界

アルゴリズムって何?

基本的な意味

アルゴリズムとは、問題を解くために決められた手順のことです。もっと正確に言うと「明確に定義され、順序付けられた有限個の規則からなる集合」なんです。

身近な例で考えてみましょう。

カップラーメンの作り方

  1. フタを開ける
  2. お湯を入れる
  3. 3分待つ
  4. よくかき混ぜる
  5. 完成

これも立派なアルゴリズムです!手順が決まっていて、誰がやっても同じ結果が得られますよね。

名前の由来

「アルゴリズム」という言葉、実は人の名前から来ているんです。

9世紀のペルシャ(現在のイラン)に、ムハンマド・イブン・ムーサー・アル=フワーリズミーという数学者がいました。彼が書いた数学の本が12世紀にヨーロッパに伝わったとき、著者名のラテン語表記「Algoritmi」が「Algorithm(アルゴリズム)」という言葉になったんです。

ちなみに「Algebra(代数)」という言葉も、同じ人の別の本から生まれました。一人で2つも重要な数学用語を生み出したなんて、すごいですよね。

なぜアルゴリズムが大切なの?

同じ問題を解くにも、やり方次第で速さが全然違います。

例えば、1000冊の本が並んだ本棚から特定の本を探すとき:

  • 最悪のやり方:端から1冊ずつ見る → 1000回調べる必要がある
  • 賢いやり方:真ん中を見て左右に分ける → 10回程度で見つかる

このように、良いアルゴリズムを使えば100倍速くなることもあるんです!

アルゴリズムの速さを表す方法

Big-O記法とは

アルゴリズムの性能を表すために「Big-O記法(ビッグオー記法)」という表現が使われます。1894年にドイツの数学者パウル・バッハマンが発明しました。

これは「データ量が増えたとき、処理時間がどう増えるか」を表す方法です。

主な計算量の種類

記法名前速さ
O(1)定数時間★★★★★ 超高速配列の特定位置を見る
O(log n)対数時間★★★★☆ 高速二分探索
O(n)線形時間★★★☆☆ 普通全部を1回ずつ見る
O(n log n)線形対数時間★★☆☆☆ やや遅い効率的なソート
O(n²)二乗時間★☆☆☆☆ 遅い二重ループ
O(2ⁿ)指数時間☆☆☆☆☆ 超遅い全パターン試す

データが10個から100個に増えたとき、どうなるかを見てみましょう:

  • O(1):変わらない!
  • O(log n):約3倍
  • O(n):10倍
  • O(n²):100倍
  • O(2ⁿ):天文学的な増加

だから大量のデータを扱うときは、計算量が小さいアルゴリズムを選ぶことが重要なんです。

ソートアルゴリズム──並び替えの技術

ソートとは、データを決まった順番(大きい順、小さい順など)に並び替えることです。

コンピュータサイエンスで最も研究されている分野の一つで、歴史も古く、1945年に天才数学者フォン・ノイマンがマージソートを発明したのが始まりとされています。

基本的なソート(初心者向け)

バブルソート

発明年:1956年
発明者:Edward H. Friend
計算量:O(n²)

隣り合う2つを比べて、大きい方を後ろに動かす操作を繰り返します。泡(バブル)が浮き上がるように大きい値が後ろに移動していくのでこの名前がつきました。

一番わかりやすいアルゴリズムですが、遅いので実用ではほとんど使われません。教育用として重要なんです。

選択ソート

発明年:1950年代
計算量:O(n²)

まだ並んでいない部分から一番小さいものを選んで、先頭に持ってくる操作を繰り返します。シンプルですが、やはり遅いですね。

挿入ソート

計算量:O(n²)

トランプの手札を整理するときのように、1枚ずつ正しい位置に挿入していきます。データがほぼ並んでいる場合はとても速いという特徴があります。

実用的なソート(現場で使われる)

クイックソート

発明年:1959年
発明者:C.A.R. ホーア(イギリス)
平均計算量:O(n log n)
最悪計算量:O(n²)

「ピボット」という基準値を選んで、それより小さいグループと大きいグループに分けます。この分割を再帰的に繰り返すんです。

実は、発明者のホーアはモスクワ国立大学に留学中、ロシア語-英語辞書を作るためにこのアルゴリズムを考案しました。現在でも実用上最速のソートアルゴリズムの一つとされています。

マージソート

発明年:1945年
発明者:ジョン・フォン・ノイマン
計算量:O(n log n)(常に安定)

データを半分に分割し続けて、最小単位まで分けてから、並び替えながら結合(マージ)していきます。

どんな場合でもO(n log n)を保証する安定したアルゴリズムです。天才フォン・ノイマンがコンピュータ黎明期に発明した歴史的なアルゴリズムなんですよ。

ヒープソート

発明年:1964年
発明者:J.W.J. ウィリアムズ
計算量:O(n log n)

「ヒープ」という特殊なデータ構造を使って並び替えます。追加のメモリをほとんど使わないという利点があるんです。

ティムソート

発明年:2002年
発明者:ティム・ピーターズ
計算量:O(n log n)

マージソートと挿入ソートを組み合わせた、最新の実用的アルゴリズムです。実際のデータには「すでに並んでいる部分」があることが多いので、それを賢く利用するんです。

すごいのは、このアルゴリズムが広く採用されていること:

  • Python(標準ソート)
  • Java SE 7以降
  • Android
  • Chrome/Node.js(V8エンジン)
  • Swift

プログラミング言語の標準ソートとして使われているんですね。

イントロソート

発明年:1997年
発明者:デイビッド・マッサー
計算量:O(n log n)(保証)

クイックソートで始めて、深く潜りすぎたらヒープソートに切り替える賢いハイブリッド型です。

こちらも広く採用されています:

  • C++(std::sort)
  • .NET Framework 4.5以降
  • Go
  • Rust

特殊な状況で使えるソート

計数ソート

発明年:1954年
発明者:ハロルド・H・シーワード
計算量:O(n + k)

整数の並び替え専用です。各数字が何個あるかを数えて並べ直します。範囲が限られた整数なら超高速なんです。

基数ソート

発明年:1887年(!)/ 1954年
計算量:O(d(n + k))

実は1887年にハーマン・ホレリスがアメリカ国勢調査のために発明した、とても古いアルゴリズムです。桁ごとに並び替えていく方法ですね。

バケットソート

計算量:O(n)(データが均等分布の場合)

データをいくつかの「バケツ」に振り分けてから、各バケツ内でソートします。データの分布が偏っていなければ高速です。

どのソートを使えばいい?

基本的には言語の標準ソート関数を使いましょう

  • Python → ティムソート
  • C++/Java → イントロソートまたはティムソート
  • JavaScript → ティムソート(V8エンジン)

これらは賢い人たちが何十年もかけて最適化したものなので、自分で書くより確実に速いです。

検索アルゴリズム──探し物をする技術

線形探索(リニアサーチ)

計算量:O(n)

最もシンプルな方法。先頭から1つずつ見ていきます。データが並んでいなくても使えるのが利点ですね。

二分探索(バイナリサーチ)

発明年:1946年
発明者:ジョン・モークリー
計算量:O(log n)

ソート済みのデータ専用です。真ん中を見て、目標より大きいか小さいかで半分に絞り込みます。

1000個のデータでも10回程度で見つかるという驚異的な効率です!ただし、正しく実装するのは意外と難しく、バグのない実装が発表されたのは1962年だったそうです。

辞書で単語を引くときの方法と同じですね。

補間探索

発明年:1957年
発明者:W.W. ピーターソン
計算量:O(log log n)(最良)

均等に分布したデータなら、値から位置を推測して探します。例えば「ま」で始まる単語を辞書で探すとき、真ん中より少し後ろを開きますよね。それと同じ発想です。

ハッシュテーブル

計算量:O(1)(平均)

実は探索ではなくデータ構造ですが、超高速検索の代名詞です。キーから直接位置を計算するので、一瞬で見つかるんです。

辞書(Dictionary)やマップ(Map)として、ほぼすべてのプログラミング言語に組み込まれています。

グラフアルゴリズム──つながりを探る技術

グラフとは、点(ノード)と線(エッジ)でつながりを表したものです。SNSの友達関係、道路網、インターネットの構造など、あらゆるものがグラフで表現できます。

探索アルゴリズム

幅優先探索(BFS)

発明年:1945年
発明者:コンラート・ツーゼ
計算量:O(V + E)

スタート地点から近い順に探索していきます。最短経路を見つけるのに便利です。

具体的には:

  1. スタート地点の隣を全部見る
  2. その次に、さらにその隣を全部見る
  3. 繰り返す

波紋が広がるようなイメージですね。

深さ優先探索(DFS)

発明年:19世紀(迷路の解法として)/ 1970年代(形式化)
発明者:ピエール・トレモー / ロバート・ターヤン
計算量:O(V + E)

一本道を突き進んで、行き止まったら戻る方法です。迷路を解くときの「右手法」と同じ発想なんです。

最短経路アルゴリズム

ダイクストラ法

発明年:1956年
発明者:エドガー・ダイクストラ(オランダ)
計算量:O((V+E) log V)

2地点間の最短経路を見つけるアルゴリズムです。面白いエピソードがあって、ダイクストラは恋人とアムステルダムを散歩中、頭の中だけでこのアルゴリズムを考案したそうです。

GPSナビゲーションの基盤技術で、Google Mapsなどで使われています。ただし、マイナスの距離(負の重み)には対応できないという制限があります。

ベルマン-フォード法

発明年:1955年
発明者:リチャード・ベルマン、レスター・フォード
計算量:O(VE)

ダイクストラ法より遅いですが、負の重みにも対応できます。ネットワークのルーティングプロトコル(RIP)で使われているんです。

フロイド-ワーシャル法

発明年:1962年
発明者:ロバート・フロイド、スティーブン・ワーシャル
計算量:O(V³)

すべての点からすべての点への最短経路を一度に計算します。遅いですが、小規模なグラフで全ペアの距離が必要なときに便利です。

A*アルゴリズム(エースター)

発明年:1968年
発明者:ピーター・ハート、ニルス・ニルソン、バートラム・ラファエル
計算量:O(b^d)

スタンフォード研究所のロボット「Shakey」のために開発されました。ゴールの方向を予測して探索するので、ダイクストラ法より効率的なんです。

ゲームAIのパスファインディング(キャラクターの経路探索)で最も広く使われています。RPGで敵キャラが追いかけてくるとき、裏ではA*が動いているんですよ。

最小全域木アルゴリズム

ネットワークを最小コストでつなぐ問題です。

プリム法

発明年:1930年(実際の発明)/ 1957年(再発見)
発明者:ヴォイチェフ・ヤルニーク / ロバート・プリム
計算量:O(E log V)

1つの点から始めて、少しずつネットワークを広げていきます。

クラスカル法

発明年:1956年
発明者:ジョセフ・クラスカル
計算量:O(E log E)

コストの安い辺から順に追加していきます。ループができないように注意しながら選ぶんです。

動的計画法──答えを覚えておく技術

動的計画法(DP: Dynamic Programming)は、1950年代にリチャード・ベルマンが体系化しました。

面白いことに「Dynamic Programming」という名前は、数学研究への理解を得るために意図的に格好良くつけたそうです。

基本的な考え方は「一度計算した答えは記録しておいて、同じ問題が出てきたら再利用する」というもの。

ナップサック問題

計算量:O(nW)

重さと価値がある品物を、容量制限のあるリュックに詰め込むとき、最大の価値にする組み合わせを見つける問題です。資源配分の最適化に使われます。

最長共通部分列(LCS)

発明年:1970年
発明者:ニードルマン、ウンシュ
計算量:O(mn)

2つの文字列から共通する部分を見つけます。「diff」コマンド(ファイルの差分表示)やDNA配列比較で使われているんです。

編集距離(レーベンシュタイン距離)

発明年:1965年
発明者:ウラジーミル・レーベンシュタイン(ソ連)
計算量:O(mn)

2つの文字列がどれくらい違うかを数値化します。「挿入」「削除」「置換」の最小回数を計算するんです。

スペルチェッカーで「もしかして:〇〇」と提案してくれるのは、このアルゴリズムのおかげです。DNAの配列比較や、盗用検出にも使われています。

分割統治法──大きな問題を小さく分ける技術

大きな問題を小さな部分問題に分割して解決し、結果を統合する方法です。

カラツバ乗算法

発明年:1960年
発明者:アナトリー・カラツバ(ソ連、当時23歳の学生!)
計算量:O(n^1.585)

大きな数の掛け算を効率的に行う方法です。驚くべきエピソードがあります。

有名な数学者コルモゴロフが「掛け算はO(n²)より速くならない」と予想していました。しかし学生だったカラツバは、わずか1週間でそれを覆す方法を発見したんです。

RSA暗号などの大きな数の計算で使われています。

シュトラッセンの行列乗算

発明年:1969年
発明者:フォルカー・シュトラッセン(ドイツ)
計算量:O(n^2.807)

行列の掛け算を効率的に行う方法です。「行列の掛け算はO(n³)が最適」という常識を覆した画期的なアルゴリズムでした。

文字列アルゴリズム──文字の中から探す技術

パターンマッチング

文字列の中から特定のパターンを探す技術です。

ナイーブ法(素朴法)

計算量:O(nm)

先頭から1文字ずつずらしながら比較します。簡単ですが遅いです。

KMP法

発明年:1977年
発明者:ドナルド・クヌース、ジェームズ・モリス、ヴォーン・プラット
計算量:O(n+m)

一度調べた情報を無駄にしない賢い方法です。不一致が起きても、戻らずに次に進めるんです。

ボイヤー-ムーア法

発明年:1977年
発明者:ロバート・ボイヤー、J・ストローザー・ムーア
計算量:O(n/m)〜O(nm)

右から左に比較するという、逆転の発想です。不一致の文字を見て、大きく飛ばせる場合があるので実用上最速なんです。

テキストエディタの「検索」機能で使われています。

ラビン-カープ法

発明年:1987年
発明者:リチャード・カープ、マイケル・ラビン
計算量:O(n+m)

ハッシュ関数を使って高速化します。複数のパターンを同時に探すのが得意です。盗用検出システムで使われているんですよ。

特殊なデータ構造

トライ木

発明年:1959年 / 1961年(命名)
発明者:ルネ・ド・ラ・ブリアンデ / エドワード・フレドキン

木構造を使って文字列を効率的に保存します。オートコンプリート(入力候補の表示)やスペルチェックで使われています。

暗号化アルゴリズム──情報を守る技術

現在推奨される暗号化方式

アルゴリズム種類発明年状況用途
AES対称鍵2001✅推奨ファイル暗号化、通信
RSA公開鍵1977✅推奨デジタル署名、鍵交換
ECC公開鍵1985✅推奨モバイル、IoT
ChaCha20対称鍵2008✅推奨TLS 1.3、VPN
SHA-256ハッシュ2001✅推奨パスワード、改ざん検出
SHA-3ハッシュ2015✅推奨次世代標準

使ってはいけない暗号

アルゴリズム状況理由
DES❌廃止1999年に22時間で解読された
MD5❌廃止衝突攻撃が容易
SHA-1❌非推奨2017年に衝突攻撃成功
3DES⚠️非推奨遅く、2030年までに廃止予定

AES(Advanced Encryption Standard)

発明年:2001年
発明者:ヨアン・ダーメン、フィンセント・ライメン(ベルギー)

アメリカ政府が世界中から公募して選んだ暗号方式です。元の名前は「Rijndael(ライン�ール)」でした。

現在、世界中で最も広く使われている暗号化方式です:

  • ファイルの暗号化
  • HTTPS通信
  • VPN
  • Wi-Fi(WPA2/WPA3)
  • 米国政府のTop Secret情報の保護

RSA

発明年:1977年
発明者:ロナルド・リベスト、アディ・シャミア、レナード・アドルマン(MIT)

3人の名前の頭文字を取って「RSA」と名付けられました。

大きな素数の掛け算は簡単だけど、積から元の素数を見つける(素因数分解)のは難しい、という性質を利用しています。

デジタル署名やHTTPSで使われていますが、量子コンピュータが実用化されると破られる可能性があると言われています。

楕円曲線暗号(ECC)

発明年:1985年
発明者:ニール・コブリッツ、ビクター・ミラー(独立提案)

RSAより短い鍵で同じセキュリティを実現できます。

  • 256ビットのECC ≒ 3072ビットのRSA

スマートフォンやIoT機器など、処理能力が限られたデバイスに適しています。

ハッシュ関数

データから固定長の「指紋」を作る関数です。

SHA-256

発明年:2001年
発明者:NSA(アメリカ国家安全保障局)

ビットコインのマイニングでも使われている現代の標準ハッシュ関数です。

bcrypt

発明年:1999年
発明者:ニールス・プロヴォス、デビッド・マジエール

パスワード専用のハッシュ関数です。わざと計算に時間をかけることで、総当たり攻撃を防ぎます。

パスワードは絶対にbcryptやArgon2などの専用関数でハッシュ化しましょう。SHA-256だけでは不十分です!

圧縮アルゴリズム──データを小さくする技術

可逆圧縮(ロスレス)

元に完全に戻せる圧縮方式です。

DEFLATE

発明年:1993年
発明者:フィル・カッツ

LZ77とハフマン符号化を組み合わせた方式です。

使われている場所:

  • ZIP形式
  • gzip
  • PNG画像
  • HTTP圧縮

インターネット上のデータの大部分がこの方式で圧縮されています。

ハフマン符号化

発明年:1952年
発明者:デビッド・ハフマン(MIT学生、当時)

面白いエピソードがあります。ロバート・ファノ教授が「最適な符号化方式を見つけよ」という課題を出したところ、学生のハフマンが教授自身も解けなかった問題を解決してしまったんです。

よく出る文字には短い符号を、あまり出ない文字には長い符号を割り当てるという発想です。
JPEG、MP3、ZIPなど、あらゆる圧縮技術の基盤になっています。

Burrows-Wheeler変換(BWT)

発明年:1994年
発明者:マイケル・バローズ、デビッド・ウィーラー

魔法のような変換方法です。文字列を特殊な方法で並び替えると、同じ文字が連続しやすくなるんです。そして完全に元に戻せます。

bzip2圧縮やDNA配列解析で使われています。

非可逆圧縮(ロッシー)

完全には元に戻らないけど、人間にはわからない程度の劣化で大幅に圧縮する方式です。

JPEG

標準化:1992年

写真の圧縮方式です。人間の目が細かい色の変化に鈍感なことを利用しています。

MP3

標準化:1993年

音楽の圧縮方式です。人間の耳で聞こえない音や、大きい音に隠れて聞こえない音を削除します。

機械学習アルゴリズム──コンピュータが学習する技術

機械学習は、データからパターンを見つけて予測や分類を行う技術です。

教師あり学習

正解データを使って学習する方法です。

線形回帰

発明年:1805年
発明者:ルジャンドル、ガウス

データから直線(または平面)を引いて予測します。「過去の売上から未来の売上を予測」などに使えます。

ロジスティック回帰

発明年:1958年
発明者:デビッド・コックス

「Yes/No」の分類問題に使います。スパムメールの判定などに使われているんです。

k-NN(k最近傍法)

発明年:1951年
発明者:イブリン・フィックス、ジョセフ・ホッジス

「似ているものは同じグループ」という単純な発想です。新しいデータが来たら、近くにあるk個のデータを見て多数決します。

推薦システム(「この商品を買った人はこれも買っています」)で使われています。

サポートベクターマシン(SVM)

発明年:1963年(原型)/ 1995年(実用版)
発明者:ウラジーミル・ヴァプニク(ソ連→アメリカ)

2つのグループを最も大きな隙間(マージン)で分ける超平面を見つけます。テキスト分類や手書き文字認識で広く使われました。

決定木

発明年:1984年(CART)/ 1986年(ID3)
発明者:レオ・ブレイマン / ロス・クインラン

「Yes/Noの質問を繰り返して分類する」という人間にも理解しやすい方法です。医療診断支援などで使われます。

ランダムフォレスト

発明年:2001年
発明者:レオ・ブレイマン

決定木をたくさん作って多数決を取る方法です。「三人寄れば文殊の知恵」を実践しているんですね。

金融リスク分析、詐欺検出などで活躍しています。

XGBoost

発明年:2016年
発明者:陳天奇(ワシントン大学)

Kaggleコンペティション(データサイエンスの競技会)で圧倒的な強さを誇るアルゴリズムです。

勾配ブースティングという手法を極限まで最適化したもので、現在の実務では最も人気があります。

深層学習(ディープラーニング)

人間の脳の神経回路を模倣したニューラルネットワークを使う手法です。

パーセプトロン

発明年:1957年
発明者:フランク・ローゼンブラット

ニューラルネットワークの原型です。当時は「電子頭脳」として大きな注目を集めましたが、線形分離可能な問題しか解けないという限界がありました。

畳み込みニューラルネットワーク(CNN)

発明年:1980年(原型)/ 1989年(実用化)
発明者:福島邦彦 / ヤン・ルカン

画像認識で革命を起こしたアルゴリズムです。人間の視覚野の仕組みにヒントを得て開発されました。

顔認識、自動運転、医療画像診断など、あらゆる画像処理の基盤となっています。

LSTM(Long Short-Term Memory)

発明年:1997年
発明者:セップ・ホックライター、ユルゲン・シュミットフーバー

文章や音声など、順序が重要なデータを扱うのが得意です。

機械翻訳、音声認識、株価予測など、時系列データの処理で使われています。

Transformer(トランスフォーマー)

発明年:2017年
発明者:Googleの研究チーム

“Attention Is All You Need”という論文で発表され、AI業界に革命を起こしました。

「Attention(注意機構)」という仕組みで、文章のどこが重要かを判断します。並列処理ができるので、従来のLSTMより圧倒的に速いんです。

現代のAIの基盤となっています:

  • ChatGPT(GPT = Generative Pre-trained Transformer)
  • BERT(Google検索の理解エンジン)
  • 画像生成AI(DALL-E、Stable Diffusion)

強化学習

試行錯誤しながら学習する方法です。

Q学習

発明年:1989年
発明者:クリストファー・ワトキンス

「この状況でこの行動をすると、どれくらい良いか」を学習します。ゲームAIやロボット制御で使われています。

DQN(Deep Q-Network)

発明年:2013年
発明者:DeepMind(Googleの子会社)

Q学習にディープラーニングを組み合わせて、Atariゲームで人間を超える性能を達成しました。強化学習のブレイクスルーとなった研究です。

最適化アルゴリズム

ニューラルネットワークの学習に使われる技術です。

勾配降下法

基本的な最適化手法です。坂道を下るように、少しずつパラメータを改善していきます。

Adam

発明年:2014年
発明者:ディーデリク・キングマ、ジミー・バ

現在最も広く使われている最適化器です。学習率を自動調整してくれる賢い方法なんです。

深層学習のデフォルト設定として、ほぼすべてのフレームワークに採用されています。

その他の重要なアルゴリズム

ユークリッドの互除法

発明年:紀元前300年頃
発明者:ユークリッド(古代ギリシャ)

2つの数の最大公約数を求める方法です。人類史上最古のアルゴリズムの一つとされています。

2300年以上前のアルゴリズムが、今でも暗号技術などで現役で使われているんですよ。

高速フーリエ変換(FFT)

発明年:1965年(再発見)
発明者:ジェームズ・クーリー、ジョン・テューキー

音声や画像を周波数成分に分解する技術です。実は1805年にガウスが発明していたことが後に判明しました。

MP3圧縮、JPEG圧縮、音声認識、地震波解析など、あらゆる分野で使われています。

ブルームフィルタ

発明年:1970年
発明者:バートン・ブルーム

「このデータは見たことがあるか?」を超高速で判定するデータ構造です。少しの誤判定を許容することで、驚異的な省メモリを実現しています。

ウェブクローラー(検索エンジンのロボット)がURLの重複チェックに使っています。

Union-Find(素集合データ構造)

グループ分けと結合を高速に行うデータ構造です。クラスカル法(最小全域木)や画像のラベリングで使われます。

LRUキャッシュ

発明:1960年代

「最も長く使われていないデータを削除する」というキャッシュ管理方式です。CPUのキャッシュメモリやデータベースで広く使われています。

まとめ:アルゴリズムの世界

アルゴリズムは、コンピュータサイエンスの心臓部です。

この記事では、紀元前300年のユークリッドの互除法から、2017年のTransformerまで、2300年以上にわたる人類の知的成果を網羅的にご紹介しました。

重要なポイント

  • ソート:言語の標準ライブラリを使う(Python/Javaならティムソートまたはイントロソート)
  • 検索:ソート済みなら二分探索、キー検索ならハッシュテーブル
  • 最短経路:重み付きグラフならダイクストラ法またはA*
  • 暗号化:AESとRSA/ECC、ハッシュはSHA-256/SHA-3
  • 圧縮:可逆ならDEFLATE(ZIP/gzip)、非可逆ならJPEG/MP3
  • 機械学習:画像ならCNN、自然言語ならTransformer、表データならXGBoost

現代のプログラミング
実は、多くのアルゴリズムは自分で実装する必要がありません。ライブラリや標準関数として提供されているからです。

ただし、どのアルゴリズムがどんな特性を持つかを知っていることは重要です。それによって、適切なツールを選べるようになりますからね。

学習の次のステップ
もっと深く学びたい人は:

  1. 実際にコードを書いてみる(理論だけでなく実装も)
  2. LeetCodeやAtCoderなどの競技プログラミングに挑戦
  3. 『アルゴリズムイントロダクション』などの教科書を読む
  4. オープンソースのコードを読んで、実際の使われ方を見る

アルゴリズムは、コンピュータに「どう考えればいいか」を教える技術です。人類が何千年もかけて積み上げてきた知恵の結晶なんですね。

これらのアルゴリズムを理解することで、あなたもより良いプログラムを書けるようになるでしょう。

プログラミングの世界へようこそ!

コメント

タイトルとURLをコピーしました