はじめに
「アルゴリズム」という言葉、難しそうですね。
でも実は、私たちは毎日アルゴリズムを使っています!
アルゴリズムとは「問題を解く手順」のこと。 より良い方法を見つける「魔法の考え方」なんです。
日常生活のアルゴリズム
身の回りのアルゴリズム
🎯 毎日使っているアルゴリズム
朝の準備を早くする方法:
- 前日に服を決めておく
- 朝ごはんの準備を簡単にする
- 持ち物をまとめておく → 時間短縮のアルゴリズム!
部屋を効率的に片付ける方法:
- まず大きなものから片付ける
- 種類ごとに分ける
- 使う頻度で配置を決める → 整理整頓のアルゴリズム!
最短ルートで学校に行く方法:
- いくつかのルートを試す
- 時間を計る
- 一番早いルートを選ぶ → 経路探索のアルゴリズム!
つまり、「より良い方法を考えること」がアルゴリズムなんです!
アルゴリズムの基本的な考え方
1. 問題を小さく分ける
大きな問題は、小さな問題に分けて解決!
問題:100個のお菓子を10人で分ける
アルゴリズム1(素朴な方法):
1. 1個ずつ配る
2. 10人に配り終わったら、また1個ずつ配る
3. 100個なくなるまで繰り返す
→ 100回配る作業が必要...
アルゴリズム2(効率的な方法):
1. 100 ÷ 10 = 10個ずつと計算
2. 各人に10個ずつ渡す
→ 10回配るだけで完了!
2. パターンを見つける
繰り返しや規則性を見つけて、簡単にする!
問題:1から100までの合計を求める
アルゴリズム1(素朴な方法):
1 + 2 + 3 + ... + 99 + 100
→ 99回の足し算が必要...
アルゴリズム2(賢い方法):
パターンを発見!
1 + 100 = 101
2 + 99 = 101
3 + 98 = 101
...
50 + 51 = 101
101が50個あるので:101 × 50 = 5050
→ 1回の掛け算で完了!
有名なアルゴリズムを体験
1. 並び替え(ソート)のアルゴリズム
バブルソート(泡のように浮かび上がる)
// 数字を小さい順に並べたい
数字 = [3, 1, 4, 1, 5, 9, 2, 6]
バブルソートの手順:
1. 隣同士を比較
2. 大きい方を右に移動
3. これを繰り返す
実行過程:
[3, 1, 4, 1, 5, 9, 2, 6]
↓ 3と1を比較 → 入れ替え
[1, 3, 4, 1, 5, 9, 2, 6]
↓ 3と4を比較 → そのまま
[1, 3, 4, 1, 5, 9, 2, 6]
↓ 4と1を比較 → 入れ替え
...(続く)
最終的に:[1, 1, 2, 3, 4, 5, 6, 9]
2. 探索のアルゴリズム
二分探索(半分ずつ絞り込む)
// 1から100の中から、相手が考えた数を当てる
素朴な方法:
「1ですか?」「2ですか?」「3ですか?」...
→ 最悪100回かかる
二分探索:
「50より大きい?」→ はい
「75より大きい?」→ いいえ
「62より大きい?」→ はい
「68より大きい?」→ いいえ
「65より大きい?」→ いいえ
「63ですか?」→ 正解!
→ たった6回で当てられた!
3. 最短経路のアルゴリズム
迷路を解く
スタート → ゴールの最短ルートを見つける
右手法(簡単だけど遠回りかも):
1. 右手を壁につける
2. 壁に沿って進む
3. いつかはゴールに着く
幅優先探索(確実に最短):
1. スタートから1歩で行ける場所を全て調べる
2. 2歩で行ける場所を全て調べる
3. 3歩で行ける場所を全て調べる
...
ゴールに着いたら、それが最短ルート!
実践的なアルゴリズム
1. じゃんけん必勝法?
// 相手の癖を分析するアルゴリズム
相手の履歴 = []
じゃんけんアルゴリズム:
1. 相手の過去の手を記録
2. 一番多く出している手を分析
3. それに勝つ手を出す
例:
相手の履歴 = [グー, グー, パー, グー, チョキ, グー]
→ グーが4回(一番多い)
→ 次もグーの可能性が高い
→ パーを出す!
2. おつりの計算アルゴリズム
// なるべく少ない枚数でおつりを渡す
金額 = 768円のおつり(1000円 - 232円)
貪欲法アルゴリズム:
1. 一番大きい硬貨から使う
2. 使えるだけ使う
3. 次に大きい硬貨へ
実行:
500円玉:1枚使える(残り268円)
100円玉:2枚使える(残り68円)
50円玉:1枚使える(残り18円)
10円玉:1枚使える(残り8円)
5円玉:1枚使える(残り3円)
1円玉:3枚使える
結果:合計8枚
3. 時間割作成アルゴリズム
// 好きな授業をなるべく多く受ける
授業リスト = [
{名前: "プログラミング", 開始: 9, 終了: 10},
{名前: "数学", 開始: 9, 終了: 11},
{名前: "英語", 開始: 10, 終了: 11},
{名前: "理科", 開始: 11, 終了: 12},
{名前: "体育", 開始: 11, 終了: 13}
]
アルゴリズム:
1. 終了時間が早い順に並べる
2. 時間が重ならないものを選ぶ
結果:
- プログラミング(9-10)✓
- 英語(10-11)✓
- 理科(11-12)✓
→ 3つ受けられる!
アルゴリズムの評価
どちらが良いアルゴリズム?
⚖️ アルゴリズムの良さ
-
速さ(時間)
- 少ない手順で終わる
-
省スペース(メモリ)
- 少ない記憶で済む
-
分かりやすさ
- 誰でも理解できる
-
確実性
- 必ず正しい答えが出る
例:1から10の合計
// アルゴリズム1:順番に足す
合計 = 0
1から10まで繰り返す:
合計に足す
→ 分かりやすい!でも10回の計算
// アルゴリズム2:公式を使う
合計 = 10 × (10 + 1) ÷ 2
→ 速い!でも公式を知らないと...
// どちらも正解!場面によって使い分け
自分でアルゴリズムを作ろう
問題:宝探しゲーム
10×10のマス目に宝が1つ隠されています。 効率的に見つけるアルゴリズムを考えてください。
アルゴリズムの例を見る
アルゴリズム1:しらみつぶし
左上から右へ順番に調べる
→ 最悪100マス調べる必要がある
効率:★☆☆
確実性:★★★
アルゴリズム2:ランダム
ランダムに選んで調べる
→ 運が良ければ1回、悪ければ100回
効率:???
確実性:★★★
アルゴリズム3:渦巻き探索
中心から渦巻き状に調べる
→ 宝が中心付近にある可能性に賭ける
効率:★★☆
確実性:★★★
アルゴリズム4:4分割探索
1. 全体を4つに分ける
2. ヒントをもらう(どの区画にあるか)
3. その区画をさらに4つに分ける
4. 繰り返す
効率:★★★
確実性:★★★
よくある質問
Q: アルゴリズムは暗記するもの?
A: いいえ!大切なのは「考え方」を理解すること。
- 基本的なパターンを知る
- 自分で工夫してみる
- より良い方法を探す習慣
Q: 一番良いアルゴリズムは?
A: 場面によって違います!
- 速さが大事?
- 分かりやすさが大事?
- メモリの節約が大事?
目的に合わせて選びましょう。
練習問題
問題1:本の整理
30冊の本を、背の高さ順に並べたい。 効率的な方法を考えてください。
答えの例を見る
方法1:挿入ソート風
- 1冊目を置く
- 2冊目を、1冊目と比べて適切な位置に入れる
- 3冊目を、既に並んでいる本と比べて適切な位置に入れる
- 30冊目まで繰り返す
方法2:グループ分け
- ざっくり「高い」「中くらい」「低い」に分ける
- それぞれのグループ内で並べ替える
- グループをつなげる
方法3:トーナメント方式
- 2冊ずつペアにして比較
- 高い方を次のラウンドへ
- 最後まで続けて1位を決定
- 残りで2位、3位...と決めていく
問題2:友達探し
クラス30人の中から、誕生日が同じ友達を見つけたい。 効率的な方法を考えてください。
答えの例を見る
効率的な方法:
- 全員に誕生月を聞く(12グループに分ける)
- 同じ月の人だけで誕生日を聞く
- 同じ日の人がいたらペア成立!
なぜ効率的?:
- 全員に誕生日を聞く:30回の質問
- 月で分けてから聞く:30回(月)+ 少人数での確認 → 比較回数が大幅に減る!
実践演習:CommandPlaygroundで体験
ファイルツリー
今日のまとめ
覚えておいてほしい3つのこと
- アルゴリズムは「問題を解く賢い手順」
- 日常生活でも、より良い方法を考えることがアルゴリズム
- 同じ問題でも、いろいろな解き方がある
次回予告
次のレッスンでは、「AIと一緒にプログラミング」を学びます。
- AIは優秀な助手
- 人間の創造性 × AIの処理能力
- 新しい時代のプログラミング
AIと協力して、もっと楽しくプログラミングする方法を身につけましょう!
チャレンジ問題
ミッション:最強のじゃんけんAIを作る
じゃんけんで勝つためのアルゴリズムを設計してください。
条件:
- 相手の過去の手を分析できる
- パターンを見つけて予測する
- ランダム要素も加える(読まれないように)
ヒント:
- 人間には癖がある(同じ手を連続で出す、など)
- 直前に負けた手を次に出す傾向がある
- 3回に1回はランダムにすると読まれにくい
答えの例を見る
じゃんけんAIアルゴリズム:
// データ収集
相手の履歴 = []
勝敗履歴 = []
// パターン分析
関数 次の手を予測():
// パターン1:直前の手の次に出しやすい手
もし 相手の最後の手 == "グー" なら
次は "チョキ" の可能性60%
// パターン2:負けた後の傾向
もし 直前に負けた なら
相手は同じ手を出す可能性40%
// パターン3:連続パターン
もし 相手が2回同じ手 なら
次は違う手の可能性80%
予測を返す
// 戦略決定
関数 AIの手を決める():
ランダム値 = 0〜100の乱数
もし ランダム値 < 70 なら
// 70%は予測に基づく
予測 = 次の手を予測()
予測に勝つ手を返す
そうでなければ
// 30%はランダム(読まれない)
ランダムな手を返す
// 学習機能
関数 結果を記録(相手の手, AIの手, 結果):
相手の履歴に追加
勝敗履歴に追加
パターンを更新
このAIは:
- 相手の癖を学習する
- でも完全に読まれないようランダム要素もある
- 対戦すればするほど強くなる!
素晴らしい!アルゴリズムの考え方が身につきました。これで、どんな問題にも「より良い解決方法」を見つけられるようになりました。プログラマーとしての「考える力」が育ちましたね!