コンテンツにスキップ

4-4. 演習問題


1-1. 順序を持つ一覧を表すのに最も適しているのはどれか。

  • A. 配列(Array)
  • B. ハッシュ
  • C. ログレベル

1-2. id のようなキーから値を取り出したいときに最も向いているのはどれか。

  • A. ハッシュ
  • B. if 文
  • C. finally ブロック

1-3. ソートの主な役割として最も適切なのはどれか。

  • A. データを一定の規則で並べ替える
  • B. 例外を無視する
  • C. クラスを継承させる

1-4. 多くの言語で配列の最初の要素を指す添字として最も典型的なのはどれか。

  • A. 0
  • B. 1
  • C. -1

1-5. 商品一覧を画面に順番どおり表示したいとき、まず考えやすい構造として最も適切なのはどれか。

  • A. 配列(Array)
  • B. ハッシュだけ
  • C. catch ブロック

1-6. 単語ごとの出現回数を数えたいとき、まず考えやすい構造として最も適切なのはどれか。

  • A. ハッシュ
  • B. 文字列結合だけ
  • C. merge conflict

次の文章の空欄を埋めてください。

  1. 問題を解くための手順を (   ) という。
  2. データの持ち方を (   ) という。
  3. 順序付きデータを扱う基本的な構造を (   ) という。
  4. キーから値を取り出しやすい構造を (   ) という。
  5. ハッシュで値を引くための識別子を (   ) という。
  6. データを規則に従って並べ替えることを (   ) という。
解答欄

3-1. アルゴリズムとデータ構造の違いを説明してください。

解答欄

3-2. どのような場面で配列(Array)が向いているか説明してください。

解答欄

3-3. どのような場面でハッシュが向いているか説明してください。

解答欄

3-4. ソートが人間やプログラムにとって役立つ理由を説明してください。

解答欄

ブラウザ上のプレイグラウンドで、配列・ハッシュ・ソートをまとめて動かしてみましょう。
この演習では、順序付きデータの実例として JavaScript の Array を使う。

① プレイグラウンドを開く

下のコードはそのまま実行できます。必要に応じて書き換えながら試してください。

実行プレイグラウンド
編集内容は自動保存されます / Ctrl+Enter でも実行できます
出力
「実行」を押すと、ここに結果が表示されます。

② コードを確認する

  • books 配列を最初に定義していることを確認する
  • byId を作る処理と、sort() で並び替える処理があることを確認する

③ 実行する

「実行」を押し、出力欄を確認する。

次のような表示が出れば成功:

[Original order]
3: Network (2800)
1: Git (2200)
2: JavaScript (3200)
[Lookup id=2]
{ id: 2, title: 'JavaScript', price: 3200 }
[Sorted by price]
Git: 2200
Network: 2800
JavaScript: 3200
  • 最初に元の順番が表示されることを確認する
  • id=2 の検索結果が取り出せることを確認する
  • 価格順に並び替えた結果を確認する

④ データを追加する

books 配列の定義に、4 件目として次のデータを追加してから、もう一度実行する。

const books = [
{ id: 3, title: "Network", price: 2800 },
{ id: 1, title: "Git", price: 2200 },
{ id: 2, title: "JavaScript", price: 3200 },
{ id: 4, title: "Database", price: 2600 }, // 追加
];

「実行」をもう一度押し、次のように元の順番と価格順が変われば成功:

[Original order]
3: Network (2800)
1: Git (2200)
2: JavaScript (3200)
4: Database (2600)
[Lookup id=2]
{ id: 2, title: 'JavaScript', price: 3200 }
[Sorted by price]
Git: 2200
Database: 2600
Network: 2800
JavaScript: 3200
  • byId[4] も確認したい場合は、一時的に console.log(byId[4]); を追加すると、{ id: 4, title: 'Database', price: 2600 } のように表示される
  • 元の順番と価格順がどう変わるか確認する
  • byId[4] でも取り出せることを確認する

問題1の解答(クリックで開く)

1-1. 正解:A. 配列(Array)

解説

  • A が正しい。配列は順序付きデータの基本構造である。
  • B のハッシュはキー検索向きであり、順序が主目的ではない。
  • C はデータ構造ではない。

1-2. 正解:A. ハッシュ

解説

  • A が正しい。キーから目的の値を引きたいときはハッシュが向いている。
  • B と C はデータ構造の話ではない。

1-3. 正解:A. データを一定の規則で並べ替える

解説

  • A が正しい。ソートは「昇順」「降順」など一定の規則で並び替える処理である。
  • B は例外処理の話であり、C はオブジェクト指向の話である。

1-4. 正解:A. 0

解説

  • A が正しい。多くの言語では配列の先頭は 0 番目として扱う。
  • B は人間には自然でも、配列の添字としては典型ではない。
  • C は今回の基本説明とは合わない。

1-5. 正解:A. 配列(Array)

解説

  • A が正しい。一覧を順番どおり表示したいときは、順序を持つ構造が分かりやすい。
  • B のハッシュだけでは、順番という観点が弱くなる。
  • C は構文であり、データ構造ではない。

1-6. 正解:A. ハッシュ

解説

  • A が正しい。単語ごとの件数を「単語 → 回数」と対応付けると考えると、ハッシュが向いている。
  • B はただの文字列操作であり、件数管理には不向きである。
  • C は Git の話である。
問題2の解答(クリックで開く)
  1. アルゴリズム

問題を解くための手順である。並べ替えや検索の方法などがこれにあたる。

  1. データ構造

データの持ち方である。どのように保存し、どう取り出すかに影響する。

  1. 配列

この演習で使っている JavaScript の Array のように、順序を持つデータを扱う構造である。一覧表示や順番処理に向いている。

  1. ハッシュ

キーから値を取り出しやすい構造である。ID 検索などで役立つ。

  1. キー

値を引くための識別子である。ハッシュではこのキーが入口になる。

  1. ソート

一定の規則に従って並べ替えること。人間にもプログラムにも扱いやすい順序を作れる。

問題3の解答例(クリックで開く)

3-1. アルゴリズムとデータ構造の違い

アルゴリズムは問題を解くための手順であり、データ構造はデータの持ち方である。 たとえば本を価格順に並べるなら、「どのように並べるか」がアルゴリズム、「本を配列やハッシュで持つこと」がデータ構造である。 役割は違うが、実際には組み合わせて使われる。


3-2. 配列(Array)が向いている場面

順番を保って一覧表示したいときや、先頭から順番に全部処理したいときに向いている。 たとえば商品一覧、メッセージ一覧、テスト結果一覧などが代表例である。 順序そのものに意味がある場面では特に使いやすい。


3-3. ハッシュが向いている場面

ID や名前などのキーから、目的の値をすぐ取り出したいときに向いている。 たとえば userId -> userword -> count のような対応を持たせる場面で便利である。 「何番目か」より「何というキーか」が重要なときに強い。


3-4. ソートが役立つ理由

ソートすると一覧が見やすくなり、最小値や最大値も見つけやすくなる。 また、後続処理で「安い順に上位 3 件を出す」などのロジックも組み立てやすくなる。 つまりソートは見た目だけでなく、処理のしやすさにも関係している。

問題4の解答例(クリックで開く)

③ 実行結果の例

[Original order]
3: Network (2800)
1: Git (2200)
2: JavaScript (3200)
[Lookup id=2]
{ id: 2, title: 'JavaScript', price: 3200 }
[Sorted by price]
Git: 2200
Network: 2800
JavaScript: 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: 2200
Database: 2600
Network: 2800
JavaScript: 3200

元の順番には追加位置が反映され、価格順では 2600 の位置へ入る。 つまり「追加した順番」と「並べ替えた順番」は別であることが分かる。


④-2. byId[4] が取り出せる理由

ループの中で byId[book.id] = book; としているため、id: 4 の本も byId[4] で引けるようになる。 これは「配列で一覧を持ちつつ、ハッシュで検索もできるようにする」典型的な形である。


データ構造とアルゴリズムの関係を図で見る

books 配列
一覧表示できる
byId を作る
id から検索できる
sort() を使う
価格順に並べ替えられる

同じデータでも、「一覧に使う」「検索に使う」「並べ替える」で必要な考え方が変わることを確認できる。