過去問解きまくり研究所 ホーム

平成21年度 秋期 午前 問5

基礎理論

連結リストに関する問題

*n* 個の要素 x₁,x₂,…,xₙ から成る連結リストに対して,新たな要素 xₙ₊₁ の末尾への追加に要する時間を f(n) とし,末尾の要素 xₙ の削除に要する時間を g(n) とする。*n* が非常に大きいとき,実装方法 1 と実装方法 2 における g(n)/f(n) の挙動として,適切なものはどれか。

〔実装方法 1〕
 先頭のセルを指すポインタ型の変数 front だけをもつ。

front[●] → [x₁|●] → [x₂|●] → … → [xₙ|\]

〔実装方法 2〕
 先頭のセルを指すポインタ型の変数 front と,末尾のセルを指すポインタ型の変数 rear を併せもつ。

front[●] → [x₁|●] → [x₂|●] → … → [xₙ|\]
rear [●] ────────────────────────↗
実装方法 1実装方法 2
アほぼ 1 になる。ほぼ 1 になる。
イほぼ 1 になる。ほぼ n に比例する。
ウほぼ n に比例する。ほぼ 1 になる。
エほぼ n に比例する。ほぼ n に比例する。
答えと解説を見る

✓ これが正解イほぼ 1 になる。 ほぼ n に比例する。

解説

末尾を指す変数があると、追加だけが速くなります。

連結リストは、各セルが値と次のセルへのポインタをもち、先頭から数珠つなぎに辿っていく構造です。先頭を指す変数だけをもつ実装では、末尾へ要素を足すにも、末尾の要素を消すにも、まず先頭から末尾まで辿る必要があります。どちらも同じだけ辿るので、二つの時間はほぼ同じ大きさになり、割り算した比は一定の値に近づきます。末尾を指す変数も併せもつ実装では、追加のほうは末尾に一足で届くので、要素数がいくら増えても時間はほとんど変わりません。ところが削除のほうは事情が違います。末尾を消したあと、新しい末尾となる一つ手前のセルを指し直さなければならず、ポインタが前向きにしか張られていないので、その一つ手前を探すには結局先頭から辿ることになります。分母だけが一定のまま分子が要素数とともに伸びるので、比は要素数に比例して大きくなります。

ほかの選択肢はなぜ違うのか

出典:平成21年度 秋期 応用情報技術者試験 午前 問5

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)