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

分野:アルゴリズムとプログラミング(データ構造・アルゴリズム・探索整列・計算量の実際・擬似言語・プログラム言語・データ記述言語)|実際に出題されたIPA過去問題

n 個の要素 x1,x2,…,xn から成る連結リストに対して,新たな要素 xn+1 の末尾への追加に要する時間を f(n) とし,末尾の要素 xn の削除に要する時間を g(n) とする。n が非常に大きいとき,実装方法1と実装方法2における g(n)/f(n) の挙動として,適切なものはどれか。〔実装方法1〕先頭のセルを指すポインタ型の変数 front だけをもつ。〔実装方法2〕先頭のセルを指すポインタ型の変数 front と,末尾のセルを指すポインタ型の変数 rear を併せもつ。

問題の図表(IPA公式問題冊子より引用)
図表:IPA公式問題冊子より
  1.  実装方法1:ほぼ1になる。実装方法2:ほぼ1になる。
  2.  実装方法1:ほぼ1になる。実装方法2:ほぼnに比例する。
  3.  実装方法1:ほぼnに比例する。実装方法2:ほぼ1になる。
  4.  実装方法1:ほぼnに比例する。実装方法2:ほぼnに比例する。
解答・解説を見る

正解:イ

AI解説

frontのみを持つ実装方法1では末尾要素の削除は先頭から順にたどる必要がありg(n)はnに比例するが、末尾追加は末尾までたどる必要がありf(n)もnに比例するため両者の比はほぼ1になる。frontとrearを両方持つ実装方法2では追加f(n)はO(1)だが、削除は単方向リストのため末尾の一つ前の要素を探すのにO(n)かかりg(n)/f(n)はnに比例する。 ア: 実装方法2ではrearがあっても単方向リストでは末尾の一つ前を辿るのに時間がかかるため、g(n)/f(n)が「ほぼ1になる」とする記述は誤りである。 イ: 正しい。実装方法1ではf(n)・g(n)がともにnに比例するため比はほぼ1になり、実装方法2ではf(n)がO(1)なのに対しg(n)がO(n)のままなので比はnに比例する。 ウ: 実装方法1でg(n)/f(n)がnに比例するという記述は、追加も削除もほぼ同じ時間(nに比例)がかかるため比が1に近づく実態と矛盾する。 エ: 実装方法1・2ともに比がnに比例するという記述は、実装方法2でrearを使うことでf(n)がO(1)になる効果を無視しており誤りである。 💡 単方向連結リストでは末尾へのポインタ(rear)があっても「末尾の削除(一つ前の要素を探す)」は依然としてO(n)である点が引っかかりやすい。追加は速くなるが削除は速くならない、という非対称性を覚えておく。

出典:平成21年度 秋期 応用情報技術者試験 午前 問5 / 独立行政法人情報処理推進機構(IPA)
※Web掲載用に表記を一部変更しています。図表はIPA公式問題冊子から引用しています。著作権はIPAに帰属します。
📱 演習アプリで解く(無料・登録不要・2,640問収録)

「アルゴリズムとプログラミング」分野の攻略ポイント

データ構造・アルゴリズム・探索と整列・計算量・擬似言語・プログラム言語・データ記述言語が対象です。擬似言語のトレースは時間はかかるものの、落ち着いて表を書けば必ず正解にたどり着く「確実に取れる」問題です。

アルゴリズムとプログラミングの攻略ポイントをすべて見る(要点6項目・ひっかけ3項目)→

同じ分野(アルゴリズムとプログラミング(データ構造・アルゴリズム・探索整列・計算量の実際・擬似言語・プログラム言語・データ記述言語))の過去問