応用情報技術者 2020年 秋期 午前2 問05
問題文
ポインタを用いた線形リストの特徴のうち、適切なものはどれか。
選択肢
ア:先頭の要素を根としたn 分木で、先頭以外の要素は全て先頭の要素の子である。
イ:配列を用いた場合と比較して、2分探索を効率的に行うことが可能である。
ウ:ポインタから次の要素を求めるためにハッシュ関数を用いる。
エ:ポインタによって指定されている要素の後ろに、新たな要素を追加する計算量は、要素の個数や位置によらず一定である。(正解)
🔒 解説は解答すると表示されます
ポインタ線形リストの挿入【午前2解説】
正解の理由
ポインタで指定された要素の直後に新しい要素を挿入する場合、挿入はその指定ノードのポインタだけを更新すればよく、操作は要素数や位置に依存せず一定時間で終わります。したがって選択肢のうち、挿入計算量が常に一定であることを述べている エ が正しいです。具体的には単方向(あるいは双方向)の連結リストで「挿入位置を表すノードへの参照(ポインタ)」が既に与えられているとき、新ノードの next を設定し、前ノードの next を新ノードに向けるだけで済み、必要な操作は固定個数です()。
解法ステップ
- 問題がどの操作について問うているかを確認する(今回:ある要素の「後ろに追加する」操作)。
- 「挿入位置を示すポインタが与えられているか」を考える。与えられているなら探索は不要。
- ポインタ更新だけで済むか()を判断する。探索が必要なら 。
- 他の選択肢がデータ構造の性質や利用方法と矛盾しないかを確認する。
この手順で、「位置が既知なら挿入は 」と結論づけます。
選択肢別の誤答解説
-
ア: 「先頭の要素を根とした n 分木で、先頭以外の要素は全て先頭の要素の子である」
→ 連結リストは線形構造であり、木構造の記述ではない。先頭の要素がすべての要素の親となるのは誤り。 -
イ: 「配列を用いた場合と比較して、2分探索を効率的に行うことが可能である」
→ 二分探索はランダムアクセスが前提(添字で中間要素へ直接アクセスできること)であり、連結リストは中間要素への直接アクセスができないため二分探索は非効率(一般に のアクセスが必要)。したがって誤り。 -
ウ: 「ポインタから次の要素を求めるためにハッシュ関数を用いる」
→ ポインタ(参照)は次ノードのアドレス(参照)を直接保持する。ハッシュ関数は不要であり適切でない。誤り。 -
エ: 「ポインタによって指定されている要素の後ろに、新たな要素を追加する計算量は、要素の個数や位置によらず一定である」
→ 挿入位置を示すノードの参照が既にある場合、ポインタ更新のみで済むため一定時間()。ここが妥当なので正しい。
よくある誤解
-
「末尾への追加=常に 」と考える誤解
- 末尾に追加しても、末尾を指すポインタ(tail)が保持されていなければ最後まで探索する必要があり になる。末尾ポインタを持っていれば末尾追加は にできる点を区別すること。
-
「連結リストならどの挿入も 」という誤解
- 任意の位置に挿入するためにその位置を見つける探索が必要なら総コストは探索時間を含む(位置不明なら )。挿入自体は でも、位置決定が時間を要する点を見落とさないこと。
-
「二分探索はどんな線形構造でも速い」
- 二分探索は配列のランダムアクセスを前提とするため、連結リストでは適用できない(アクセスコストが増え、アルゴリズム全体はむしろ遅くなる)。
補足コラム
単方向リスト(singly linked list)での「ノード後ろへの挿入」手順(擬似コード):
# node は挿入位置のノードへの参照、new_node は挿入するノード
new_node.next = node.next
node.next = new_node
上記は実行ステップが固定なので計算量は です。一方、もし「値 x の後ろに挿入」などで x を持つノードを探索する必要がある場合は、最悪でリスト全体を辿るため になります。末尾追加でも末尾参照が無ければ同様に です。
双方向リスト(doubly linked list)では前ノードも参照できるため、先頭や末尾の削除・挿入などがさらに扱いやすくなる場面がありますが、基本原理は同様です:位置が既知ならポインタ更新で定数時間。
FAQ
Q: 単方向リストで「要素番号 i の後ろ」に挿入する場合の計算量は?
A: 要素番号 i のノードへの参照が既にあるなら挿入は 。参照がない(番号から探索する場合)はその探索に が必要。
A: 要素番号 i のノードへの参照が既にあるなら挿入は 。参照がない(番号から探索する場合)はその探索に が必要。
Q: 末尾への追加は常に ですか?
A: 末尾への参照(tail ポインタ)を保持している設計なら 。保持していない場合は末尾を見つけるために全走査が必要で になります。
A: 末尾への参照(tail ポインタ)を保持している設計なら 。保持していない場合は末尾を見つけるために全走査が必要で になります。
Q: 「ポインタ」と「ハッシュ」の役割は置き換え可能ですか?
A: 置き換えられません。ポインタはメモリ上の実際の参照(アドレス)であり、次要素を直接示す。ハッシュ関数はキーを別の値に写像するもので、連結リストの次要素取得には不要かつ不適切です。
A: 置き換えられません。ポインタはメモリ上の実際の参照(アドレス)であり、次要素を直接示す。ハッシュ関数はキーを別の値に写像するもので、連結リストの次要素取得には不要かつ不適切です。
関連キーワード: 単方向リスト、連結リスト、挿入時間、探索コスト、末尾ポインタ、二分探索、ハッシュ関数

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

