4-4. 演習問題
問題1:選択問題
Section titled “問題1:選択問題”1-1. 順序を持つ一覧を表すのに最も適しているのはどれか。
- A. 配列(Array)
- B. ハッシュ
- C. ログレベル
解答と解説
正解:A
- A が正しい。配列は順序付きデータの基本構造である。
- B のハッシュはキー検索向きであり、順序が主目的ではない。
- C はデータ構造ではない。
1-2. id のようなキーから値を取り出したいときに最も向いているのはどれか。
- A. ハッシュ
- B. if 文
- C. finally ブロック
解答と解説
正解:A
- A が正しい。キーから目的の値を引きたいときはハッシュが向いている。
- B と C はデータ構造の話ではない。
1-3. ソートの主な役割として最も適切なのはどれか。
- A. データを一定の規則で並べ替える
- B. 例外を無視する
- C. クラスを継承させる
解答と解説
正解:A
- A が正しい。ソートは「昇順」「降順」など一定の規則で並び替える処理である。
- B は例外処理の話であり、C はオブジェクト指向の話である。
1-4. 多くの言語で配列の最初の要素を指す添字として最も典型的なのはどれか。
- A.
0 - B.
1 - C.
-1
解答と解説
正解:A
- A が正しい。多くの言語では配列の先頭は 0 番目として扱う。
- B は人間には自然でも、配列の添字としては典型ではない。
- C は今回の基本説明とは合わない。
1-5. 商品一覧を画面に順番どおり表示したいとき、まず考えやすい構造として最も適切なのはどれか。
- A. 配列(Array)
- B. ハッシュだけ
- C. catch ブロック
解答と解説
正解:A
- A が正しい。一覧を順番どおり表示したいときは、順序を持つ構造が分かりやすい。
- B のハッシュだけでは、順番という観点が弱くなる。
- C は構文であり、データ構造ではない。
1-6. 単語ごとの出現回数を数えたいとき、まず考えやすい構造として最も適切なのはどれか。
- A. ハッシュ
- B. 文字列結合だけ
- C. merge conflict
解答と解説
正解:A
- A が正しい。単語ごとの件数を「単語 → 回数」と対応付けると考えると、ハッシュが向いている。
- B はただの文字列操作であり、件数管理には不向きである。
- C は Git の話である。
問題2:穴埋め問題
Section titled “問題2:穴埋め問題”次の文章の空欄を埋めてください。
- 問題を解くための手順を ( ) という。
- データの持ち方を ( ) という。
- 順序付きデータを扱う基本的な構造を ( ) という。
- キーから値を取り出しやすい構造を ( ) という。
- ハッシュで値を引くための識別子を ( ) という。
- データを規則に従って並べ替えることを ( ) という。
解答と解説
- アルゴリズム
問題を解くための手順である。並べ替えや検索の方法などがこれにあたる。
- データ構造
データの持ち方である。どのように保存し、どう取り出すかに影響する。
- 配列
この演習で使っている JavaScript の Array のように、順序を持つデータを扱う構造である。一覧表示や順番処理に向いている。
- ハッシュ
キーから値を取り出しやすい構造である。ID 検索などで役立つ。
- キー
値を引くための識別子である。ハッシュではこのキーが入口になる。
- ソート
一定の規則に従って並べ替えること。人間にもプログラムにも扱いやすい順序を作れる。
問題3:記述問題
Section titled “問題3:記述問題”3-1. アルゴリズムとデータ構造の違いを説明してください。
解答と解説
アルゴリズムは問題を解くための手順であり、データ構造はデータの持ち方である。 たとえば本を価格順に並べるなら、「どのように並べるか」がアルゴリズム、「本を配列やハッシュで持つこと」がデータ構造である。 役割は違うが、実際には組み合わせて使われる。
3-2. どのような場面で配列(Array)が向いているか説明してください。
解答と解説
順番を保って一覧表示したいときや、先頭から順番に全部処理したいときに向いている。 たとえば商品一覧、メッセージ一覧、テスト結果一覧などが代表例である。 順序そのものに意味がある場面では特に使いやすい。
3-3. どのような場面でハッシュが向いているか説明してください。
解答と解説
ID や名前などのキーから、目的の値をすぐ取り出したいときに向いている。
たとえば userId -> user、word -> count のような対応を持たせる場面で便利である。
「何番目か」より「何というキーか」が重要なときに強い。
3-4. ソートが人間やプログラムにとって役立つ理由を説明してください。
解答と解説
ソートすると一覧が見やすくなり、最小値や最大値も見つけやすくなる。 また、後続処理で「安い順に上位 3 件を出す」などのロジックも組み立てやすくなる。 つまりソートは見た目だけでなく、処理のしやすさにも関係している。
問題4:ハンズオン
Section titled “問題4:ハンズオン”ハッシュマップの構築とソートのTODOを実装し、配列・ハッシュ・ソートの動きを確認せよ。
取り組む内容
Section titled “取り組む内容”books配列をループしてbyId[book.id] = bookの形でハッシュマップを構築するbooks.sort()に価格の昇順になる比較関数を実装する(ヒント:a.price - b.price)- 実行し、IDでの1件検索と価格順ソートの結果を確認する
確認したいポイント
Section titled “確認したいポイント”byId[2]が O(1) で検索できる理由sortの比較関数が0のまま(未実装)だと順番が変わらない理由- データを1件追加したとき、ハッシュマップとソート結果の両方に反映されるか確認する
解答と解説
③ 実行結果の例
[Original order]3: Network (2800)1: Git (2200)2: JavaScript (3200)[Lookup id=2]{ id: 2, title: 'JavaScript', price: 3200 }[Sorted by price]Git: 2200Network: 2800JavaScript: 3200最初は配列へ入れた順番で表示される。
byId[2] では、キー 2 を使って対象の本を取り出している。
sort() の後は価格の小さい順に並ぶ。
④-1. Database を追加した場合のイメージ
[Original order]3: Network (2800)1: Git (2200)2: JavaScript (3200)4: Database (2600)
[Sorted by price]Git: 2200Database: 2600Network: 2800JavaScript: 3200元の順番には追加位置が反映され、価格順では 2600 の位置へ入る。
つまり「追加した順番」と「並べ替えた順番」は別であることが分かる。
④-2. byId[4] が取り出せる理由
ループの中で byId[book.id] = book; としているため、id: 4 の本も byId[4] で引けるようになる。
これは「配列で一覧を持ちつつ、ハッシュで検索もできるようにする」典型的な形である。
データ構造とアルゴリズムの関係を図で見る
books 配列 ↓一覧表示できる ↓byId を作る ↓id から検索できる ↓sort() を使う ↓価格順に並べ替えられる同じデータでも、「一覧に使う」「検索に使う」「並べ替える」で必要な考え方が変わることを確認できる。