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

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

先頭のセルを指すポインタ型の変数frontと,末尾のセルを指すポインタ型の変数rearを併せもつ。

出典:平成21年秋期 問 5

広告
2つの連結構造(単方向リスト・双方向リスト)において、
※一回のポインタ参照→次のセルへのアクセスに要する時間は一定であるとし、処理に要する時間は、このセル移動に回数に比例するものとします。
まず〔実装方法1〕について考えます。
"新要素(n+1)の末尾への追加"は、 ポインタfrontからリスト構造を末尾のデータ(n)まで順にたどり、末尾のデータのポインタ部を新しい要素へのポインタにします。したがって、セル移動の回数はn回です。
"末尾の要素の削除"は、ポインタfrontから末尾の要素の一つ前の手前の要素(n-1)までたどり、末尾の要素へのポインタを削除します。したがって、セル移動の回数はn-1回です。
nは非常に大きいという条件があるので、〔実装方法1〕の
は、(n-1)/nでほぼ1となります。
次に〔実装方法2〕について考えます。
"新要素(n+1)の末尾への追加"は、 ポインタrearを参照することで1回で末尾のセルへアクセスし、末尾のデータのポインタ部を新しい要素へのポインタにします。したがって、セル移動の回数は1回です。
"末尾の要素の削除"は、〔実装方法1〕と同様に、ポインタfrontから末尾の要素の一つ前の手前の要素(n-1)までたどり、末尾の要素へのポインタを削除します。この場合では、ポインタrearから末尾のセルへ移動することはできても、「末尾のセルからその一つ手前のセルへはポインタがないため戻ることができない」という点が理解できているかがポイントになります。したがって、セル移動の回数はn-1回です。
〔実装方法2〕の、
は、(n-1)/1でほぼnに比例となります。
以上より〔実装方法1〕="ほぼ1となる"、〔実装方法2〕="ほぼ n に比例する"の組合せで「イ」が正解となります。
- 新要素の末尾への追加 f(n)
- 末尾の要素の削除 g(n)
※一回のポインタ参照→次のセルへのアクセスに要する時間は一定であるとし、処理に要する時間は、このセル移動に回数に比例するものとします。
まず〔実装方法1〕について考えます。
"新要素(n+1)の末尾への追加"は、 ポインタfrontからリスト構造を末尾のデータ(n)まで順にたどり、末尾のデータのポインタ部を新しい要素へのポインタにします。したがって、セル移動の回数はn回です。
"末尾の要素の削除"は、ポインタfrontから末尾の要素の一つ前の手前の要素(n-1)までたどり、末尾の要素へのポインタを削除します。したがって、セル移動の回数はn-1回です。
nは非常に大きいという条件があるので、〔実装方法1〕の

次に〔実装方法2〕について考えます。
"新要素(n+1)の末尾への追加"は、 ポインタrearを参照することで1回で末尾のセルへアクセスし、末尾のデータのポインタ部を新しい要素へのポインタにします。したがって、セル移動の回数は1回です。
"末尾の要素の削除"は、〔実装方法1〕と同様に、ポインタfrontから末尾の要素の一つ前の手前の要素(n-1)までたどり、末尾の要素へのポインタを削除します。この場合では、ポインタrearから末尾のセルへ移動することはできても、「末尾のセルからその一つ手前のセルへはポインタがないため戻ることができない」という点が理解できているかがポイントになります。したがって、セル移動の回数はn-1回です。
〔実装方法2〕の、

以上より〔実装方法1〕="ほぼ1となる"、〔実装方法2〕="ほぼ n に比例する"の組合せで「イ」が正解となります。
広告