n 個の要素x1, x2, …, xn から成る連結リストに対して、新たな要素xn +1の末尾への追加に要する時間をf (n )とし、末尾の要素xn の削除に要する時間をg (n )とする。
n が非常に大きいとき、実装方法1と実装方法2におけるの挙動として、適切なものはどれか。
[実装方法1]
先頭のセルを指すポインタ型の変数frontだけをもつ。
[実装方法2]
先頭のセルを指すポインタ型の変数frontと、末尾のセルを指すポイント型の変数rearを併せもつ。
実装方法1 | 実装方法2 | |
ア | ほぼ1になる。 | ほぼ1になる。 |
イ | ほぼ1になる。 | ほぼn に比例する。 |
ウ | ほぼn に比例する。 | ほぼ1になる。 |
エ | ほぼn に比例する。 | ほぼn に比例する。 |
答え イ
【解説】
連結リストの要素の追加・削除処理では要素の数n が大きくなると、リストをたどる時間が大きくなり、処理時間はリストをたどる時間で決まることになる。
実装方法1では新たな要素を末尾に追加するときも、末尾の要素を削除するときも、変数frontから末尾までリストを順にたどって処理する必要があるため、f (n )とg (n )の時間に大きな差は発生しない。
実装方法2では新たな要素を末尾に追加するときは変数rearを利用するとリストの最後をすぐに知ることができるが、末尾の要素を削除するときは変数rearが指しているxn からxn -1をたどる手段はなく、実装方法1と同様に変数frontから末尾までリストを順にたどる必要があるので、末尾の要素を削除する処理時間g (n )は末尾に要素を追加するf (n )のn 倍の時間がかかる事になる。
【キーワード】
・連結リスト