基本情報技術者 2013年 秋期 午前(科目A) 問06
問題文
リストは、配列で実現する場合とポインタで実現する場合とがある。リストを配列で実現した場合の特徴として、適切なものはどれか。
選択肢
ア:リストにある実際の要素数にかかわらず、リストの最大長に対応した領域を確保し、実際には使用されない領域が発生する可能性がある。(正解)
イ:リストにある実際の要素数にかかわらず、リストへの挿入と削除は一定時間で行うことができる。
ウ:リストの中間要素を参照するには、リストの先頭から順番に要素をたどっていくので、要素数に比例した時間が必要となる。
エ:リストの要素を格納する領域の他に、次の要素を指し示すための領域が別途必要となる。
リストを配列で実現した場合の特徴【午前2 解説】
要点まとめ
- 結論→配列で実現したリストは、事前に最大長分の領域を確保する方式が一般的で実際の要素数に関わらず未使用領域が生じる可能性がある。
- 根拠→固定長配列は容量が固定で、挿入や削除で要素をシフトする必要があり中間操作は要素数に比例した時間を要するがランダムアクセスは高速である。
- 差がつくポイント→動的配列(再割当てあり)と固定配列を区別し、挿入・削除・参照の時間計算量とメモリ効率の違いを具体的に理解しておくこと。
正解の理由
正解: ア
配列で実現したリスト(特に静的配列)は、あらかじめ最大長に相当する領域を確保しておく方式が典型的です。そのため、実際の要素数が最大に満たない場合に未使用の領域(無駄なメモリ)が発生します。問題文の選択肢アはこの特徴を正確に述べているため正解です。
よくある誤解
- 「配列だから挿入も削除も常に高速」:配列はランダムアクセスは O(1) ですが、先頭や中間への挿入・削除は要素移動が必要で O(n) になります。
- 「配列実装=常に固定長」:動的配列は自動的に再割当てして容量を拡張するが、その際にはコピーコストが必要で一時的に余分なメモリを使うことがある。
- 「連結リストのように次要素用領域が必要」:これは連結リストの特徴であり、配列実装では要素格納領域以外に“次ポインタ”領域は通常不要です。
解法ステップ
- 各選択肢が「配列実装の特徴」として一般的に当てはまるかを確認します。
- 「メモリの確保方法」「要素参照時間」「挿入・削除の時間」「追加のポインタ領域」の4点で評価します。
- 配列はランダムアクセスが速い(インデックスで直接参照)こと、固定容量や余分領域の可能性があることを思い出す。
- それぞれの選択肢と配列の特徴を照合し、最も合致するものを選びます。
選択肢別の誤答解説
- ア: 正しい。配列実装では最大長分の領域を確保する設計があり、実際に使用されない領域(空き)が生じる可能性がある。静的配列を念頭に置いた記述として正確です。
- イ: 誤り。配列は挿入・削除が常に一定時間でできるわけではありません。先頭や中間への挿入削除は要素のシフトが必要で です(末尾への追加は動的配列で平均 だが常に一定時間ではない)。
- ウ: 誤り。リストの中間要素を先頭から順にたどる必要があるのは連結リストの性質で、配列ではインデックスで直接アクセスできるため です。
- エ: 誤り。次要素を指すためのポインタ領域が別途必要なのは連結リスト(ポインタ実装)の特徴で、配列では通常不要です。
補足コラム
- 時間計算量の比較(典型例)
- 配列(固定/動的): 参照 、末尾追加(動的・平均)、挿入/削除(先頭/中間)
- 単方向連結リスト: 参照(インデックス指定) 、挿入/削除(位置が分かっている場合)
- メモリ面では配列は要素以外のポインタ領域が不要でオーバーヘッドが小さいが、最大容量を確保することで未使用領域が発生する。連結リストは各要素にポインタ分の追加メモリが必要で、要素数が多いほどオーバーヘッドが増える。
- 実装例(C言語で固定長配列と連結リストノードのイメージ)
// 固定長配列(最大100要素)
int list[100]; // 最大長分の領域を確保、実際の使用数は別管理
// 連結リストのノード(ポインタを持つ)
struct Node {
int value;
struct Node *next; // 次要素へのポインタ領域が必要
};
FAQ
Q: 動的配列は選択肢アの「未使用領域」が当てはまりますか?
A: 動的配列も内部で容量を確保するため、一時的に未使用の空き領域が存在します。挙動は実装(再割当て戦略)によりますが、未使用領域の発生はあり得ます。
A: 動的配列も内部で容量を確保するため、一時的に未使用の空き領域が存在します。挙動は実装(再割当て戦略)によりますが、未使用領域の発生はあり得ます。
Q: 配列実装で中間要素の参照に時間がかかるという記述は完全に誤りですか?
A: 配列ではインデックスによる直接参照が可能で参照は です。中間要素を「順にたどる」必要は通常ありません(ただしアルゴリズム次第で逐次走査する場合は )。
A: 配列ではインデックスによる直接参照が可能で参照は です。中間要素を「順にたどる」必要は通常ありません(ただしアルゴリズム次第で逐次走査する場合は )。
Q: 試験で「リスト」とだけ書かれていたら配列とポインタのどちらを想定すべきですか?
A: 文脈で判断します。メモリ固定や最大長、インデックス参照の話があれば配列実装を、ポインタやnext参照の話があれば連結リストを想定します。
A: 文脈で判断します。メモリ固定や最大長、インデックス参照の話があれば配列実装を、ポインタやnext参照の話があれば連結リストを想定します。
関連キーワード: 配列、連結リスト、ポインタ、時間計算量、空間計算量、動的配列、メモリ効率

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

