Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Week 2: データ構造と計算量 | プロジェクト・ミーミル

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Hiro Hiro
March 31, 2026
66

Week 2: データ構造と計算量 | プロジェクト・ミーミル

Avatar for Hiro

Hiro

March 31, 2026

Transcript

  1. 今日のゴール 1. 構造化の意義を自分の言葉で説明できる — なぜ関数に分けるのか 2. データ構造のトレードオフを面接で問える — 良い回答と不十分な回答の違い 3.

    Big-O記法で計算量を語れる — コードを見て計算量を判断し、改善方法を示せる プロジェクト・ミーミル | Week 2 2
  2. 今日のアジェンダ 時間 パート 分 0:00 Week 1 振り返り 5分 0:05

    構造化プログラミング 5分 0:10 データ構造のトレードオフ 12分 0:22 計算量と空間計算量 13分 0:35 プチテスト 10分 0:45〜 質疑・まとめ(バッファ) 残り時間 プロジェクト・ミーミル | Week 2 3
  3. Week 1 振り返り 2進数: 各桁の重み(1, 2, 4, 8...)を足していく 2の補数: ビット反転+1。ALUに足し算の仕組みさえあれば引き算もできる

    浮動小数点: 0.1は2進数だと無限循環小数。打ち切りが誤差の正体 命令実行サイクル: フェッチ → デコード → 実行 → ストア プロジェクト・ミーミル | Week 2 4
  4. なぜ構造化するのか // 1つの関数に全部入ってる(100行) function handleSubmit(data: FormData) { // バリデーション →

    API呼び出し → エラー処理 → UI更新... } // 責務ごとに分割 function validateForm(data: FormData): ValidationResult { ... } function submitToAPI(data: FormData): Promise<Response> { ... } function handleError(error: Error): void { ... } 面接で聞くポイント: 「なぜ関数に分けるんですか?」 → 「見やすくなる」だけでは△。影響範囲の局所化・テスト容易性まで言えるか プロジェクト・ミーミル | Week 2 6
  5. 面接問題①: 良い回答 配列: [A][B][C][D][E] ← メモリ上に連続して並ぶ ↑ インデックスで一発(速い) ← 挿入すると全部ずらす(遅い)

    連結リスト: [A]→[B]→[C]→[D]→[E] ← 参照で数珠つなぎ ↑ 先頭からたどる(遅い) ← 参照を付け替えるだけ(速い) 得意・不得意が逆。何を重視するかで使い分ける → ◎ プロジェクト・ミーミル | Week 2 9
  6. 面接問題②: ハッシュテーブル 「Go の map(または JS の Object)のアクセスが O(1) なのはなぜですか?」

    users := map[string]string{ "fukami": "MP", "ono": "MP", "matsuo": "Converter", } fmt.Println(users["fukami"]) // → "MP" (O(1)) 仕組み: キー → ハッシュ関数 → インデックス → 直接アクセス プロジェクト・ミーミル | Week 2 12
  7. その他のデータ構造(面接で聞くポイントだけ) データ構 造 ポイント 皆さんに身近な例 スタック 関数が積まれて、上から順に戻 る コールスタック(Week 1)

    キュー 先に入れたものから先に処理 非同期処理の実行順 木構造 親子関係で階層的に繋がる DOM ツリー、コンポーネントツリ ー プロジェクト・ミーミル | Week 2 13
  8. Big-O記法とは 入力サイズ n が大きくなったとき、処理回数がどう増えるか 記法 名称 n=100万のとき O(1) 定数時間 1回

    O(log n) 対数時間 約20回 O(n) 線形時間 100万回 O(n log n) 線形対数 約2000万回 O(n²) 二乗時間 1兆回 プロジェクト・ミーミル | Week 2 15
  9. ワーク: このコードの計算量は? // コードA func sum(arr []int) int { total

    := 0 for _, v := range arr { total += v } return total } // コードB func hasDuplicate(arr []int) bool { for i := 0; i < len(arr); i++ { for j := i + 1; j < len(arr); j++ { if arr[i] == arr[j] { return true } } } return false } コードA と コードB、それぞれの計算量は? なぜ? プロジェクト・ミーミル | Week 2 16
  10. 面接問題③: 二分探索の時間計算量・空間計算量 func searchInArray(array []int, target int) int { left,

    right := 0, len(array)-1 for left <= right { mid := left + (right-left)/2 if array[mid] == target { return mid } else if array[mid] < target { left = mid + 1 } else { right = mid - 1 } } return -1 } このコードの時間計算量と空間計算量は? なぜ? (スキルテストの実際の出題問題です) プロジェクト・ミーミル | Week 2 17
  11. 空間計算量 そのアルゴリズムを動かすのにメモリの箱をどのくらい使うか 面接で聞いたとき、候補者にこう答えてほしい: 「使っている変数は left, right, mid の3つだけで、 入力サイズが大きくなっても増えないので O(1)

    です」 O(n) と答える候補者が多い(配列自体のメモリと混同) → 「引数の配列は除いて、計算のために新たに必要なメモリで考えてください」 → この補足で訂正できるかも評価材料 プロジェクト・ミーミル | Week 2 18
  12. まとめ・次回予告 今日のポイント 構造化: 影響範囲の局所化・テスト容易性まで言えるか データ構造: 計算量ベースでトレードオフを語れるか 計算量: コードを見て O(n) か

    O(n²) かを判断できるか 次回: Week 3「ネットワーク」 プロトコルレイヤー、TCP/IP、DNS、HTTP 今日学んだハッシュテーブルの仕組みが DNS のキャッシュにも使われている プロジェクト・ミーミル | Week 2 21
  13. 自習リソース リソース 内容 プログラミングの宝箱 第2版 配列・リスト・ソート・探索の章 Big-O Cheat Sheet 各データ構造・アルゴリズムの計算量一覧

    体系的なインプット データ構造、計算量・空間計算量、アルゴリズム プロジェクト・ミーミル | Week 2 22