基本情報技術者 2017年 春期 午前(科目A) 問04
問題文
データ構造の一つであるリストは、配列を用いて実現する場合と、ポインタを用いて実現する場合がある。配列を用いて実現する場合の特徴はどれか。ここで、配列を用いたリストは、配列に要素を連続して格納することによって構成し、ポインタを用いたリストは、要素から次の要素へポインタで連結することによって構成するものとする。
選択肢
ア:位置を指定して、任意のデータに直接アクセスすることができる。(正解)
イ:並んでいるデータの先頭に任意のデータを効率的に挿入することができる。
ウ:任意のデータの参照は効率的ではないが、削除や挿入の操作を効率的に行える。
エ:任意のデータを別の位置に移動する場合、隣接するデータを移動せずにできる。
🔒 解説は解答すると表示されます
配列実装のリスト特性【午前解説】
正解の理由
ア が正解です。
配列を用いたリストは要素を連続した領域に格納するため、インデックス(位置)から直接その要素のアドレスを計算できます。したがって「位置を指定して任意のデータに直接アクセスすることができる」という性質が成り立ち、ランダムアクセスが効率的(O(1))になります。
配列を用いたリストは要素を連続した領域に格納するため、インデックス(位置)から直接その要素のアドレスを計算できます。したがって「位置を指定して任意のデータに直接アクセスすることができる」という性質が成り立ち、ランダムアクセスが効率的(O(1))になります。
解法ステップ
- 問題文で「配列を用いたリスト」と「ポインタを用いたリスト(連結リスト)」の実装差を確認する。
- 配列:要素が連続格納 → インデックスから直接アクセス可能(O(1))。連結リスト:ポインタで接続 → 先頭から辿る必要。
- 各選択肢を「ランダムアクセス」「挿入・削除」「要素移動」の観点で評価する。
- 最も配列の特性に合致する選択肢を選ぶ(本問ではランダムアクセスが該当)。
選択肢別の誤答解説
- ア: 正解。配列は要素のアドレスを計算して直接参照できるため、任意位置へのランダムアクセスが効率的です。
- イ: 誤り。配列では先頭に挿入すると以降の要素を全て一つずつ後ろにシフトする必要があり O(n) であり、連結リストであれば先頭挿入は O(1) です。
- ウ: 誤り。説明は連結リストの特徴(参照は先頭から辿るため非効率だが挿入削除はポインタ操作で効率的)を示しており、配列の特徴とは逆です。
- エ: 誤り。配列で任意のデータを別位置へ移す場合、通常は要素の移動(またはシフト)が必要であり「隣接データを移動せずにできる」は連結リストの参照の付け替えで可能な挙動ですが、データ自体を移動しないという意味では連結リストの方が有利です。
よくある誤解
- 「配列は常に挿入・削除が速い」と誤解しやすい:任意位置での挿入・削除は要素のシフトが必要で O(n) です。
- 「ポインタを使ったリストでもインデックスで即アクセスできる」と誤る:連結リストは先頭から順に辿る必要がありランダムアクセスは効率的ではありません。
- 動的配列(伸縮する配列)と静的配列を混同して、増長コストを軽視するミス。
補足コラム
- 動的配列(例えば配列を倍増して容量を確保する実装)では、末尾への追加は平均的に O(1)(アモルタイズド)ですが、再割当て時には O(n) のコストが発生します。
- メモリ局所性(キャッシュ効果)は配列の大きな利点で、連続走査が多い処理では配列が著しく高速になります。
- 逆に頻繁な任意位置への挿入削除が多い用途(例:キューの中間操作)では連結リストや別データ構造を選択する方が適切です。
FAQ
Q1: 配列と連結リスト、どちらを選べば良いですか?
A1: ランダムアクセスや走査性能を重視するなら配列。頻繁な任意位置挿入削除を重視するなら連結リストが向きます。用途に応じて選択してください。
A1: ランダムアクセスや走査性能を重視するなら配列。頻繁な任意位置挿入削除を重視するなら連結リストが向きます。用途に応じて選択してください。
Q2: 動的配列は配列の問題点を解決しますか?
A2: 容量不足を自動で拡張できますが、拡張時にコピーが発生するためその瞬間だけコストが高くなります。平均コストは低く抑えられます。
A2: 容量不足を自動で拡張できますが、拡張時にコピーが発生するためその瞬間だけコストが高くなります。平均コストは低く抑えられます。
Q3: 配列のインデックスは0始まりと1始まり、どちらが正しい?
A3: 実装や言語仕様によりますが、多くのプログラミング言語では0始まりが一般的です。試験問題では仕様に従って判断してください。
A3: 実装や言語仕様によりますが、多くのプログラミング言語では0始まりが一般的です。試験問題では仕様に従って判断してください。
関連キーワード: 配列、連結リスト、ランダムアクセス、挿入削除、メモリ局所性、動的配列、ポインタ、シフト操作、アモルタイズドコスト

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

