連結リストとは

れんけつりすと

各要素が、値と次の要素の位置を指すポインタを持ち、それをたどってつながるデータ構造。位置が分かっていれば挿入や削除はポインタの付け替えで O(1) だが、i 番目の要素を読むには先頭からたどる O(n) が必要。要素がメモリ上に散らばりやすく、配列よりキャッシュが効きにくい。

「連結リスト」は、5分野の10問の練習問題に出てきます(データ構造とアルゴリズム, メモリ階層と性能, プログラミングの基礎(擬似言語のトレース)など)。

この用語の分野: データ構造とアルゴリズム

連結リストの練習問題に挑戦

配列と比べたときの連結リスト(各要素が次の要素の位置を指すポインタを持つリスト)の特徴として正しいものはどれか。

  1. A挿入する位置の直前の要素が分かっていれば、ほかの要素を動かさずにポインタの付け替えだけで挿入できるが、i 番目の要素を読むには先頭から順にたどる必要がある
  2. Bi 番目の要素の位置を計算で求められるので、どの要素も一定の時間 O(1) で読み出せる
  3. C要素がメモリ上に隙間なく連続して並ぶので、順に読むときにキャッシュやプリフェッチが効きやすい
答えと解説を見る

正解:A. 挿入する位置の直前の要素が分かっていれば、ほかの要素を動かさずにポインタの付け替えだけで挿入できるが、i 番目の要素を読むには先頭から順にたどる必要がある

連結リストでは、挿入や削除の位置が分かっていれば、前後のポインタを書き換えるだけで O(1) で済みます。一方、i 番目の要素を読むには先頭から i 回ポインタをたどる必要があり、O(n) かかります。配列は先頭の番地と要素の大きさから i 番目の番地を計算できるので O(1) で読めますが、途中への挿入には後ろの要素をずらす O(n) の手間がかかります。また、配列は要素が連続して並ぶためキャッシュやプリフェッチが効きやすく、メモリ上に散らばりやすい連結リストは、同じ O(n) の走査でも大幅に遅くなることがあります。

ハッシュテーブルの衝突を処理する方法として、チェイン法(同じ位置の要素を連結リストでつなぐ)とオープンアドレス法(表の中の空いている別の位置を探す)を比べた説明として正しいものはどれか。負荷率は、格納した要素数を表の大きさで割った値とする。

  1. Aチェイン法では負荷率が1を超えても格納できるが、オープンアドレス法では表の大きさを超えて格納できず、負荷率が1に近づくと探索の回数が急に増える
  2. Bオープンアドレス法では衝突が起こらないので、負荷率によらず探索は1回で済む
  3. Cチェイン法では、負荷率がいくら高くなっても探索の手間は変わらない
答えと解説を見る

正解:A. チェイン法では負荷率が1を超えても格納できるが、オープンアドレス法では表の大きさを超えて格納できず、負荷率が1に近づくと探索の回数が急に増える

チェイン法は同じ位置の要素をリストにつなぐので、要素数が表の大きさを超えても格納できますが、平均のリストの長さは負荷率に比例して伸び、探索の手間も増えます。オープンアドレス法は表の中だけに格納するので要素数は表の大きさまでで、負荷率が1に近づくと空きを探す回数が急に増えます。どちらの方法でも、負荷率が決めた値(例えば0.5〜0.75程度)を超えたら表を大きくして全要素を入れ直す(リハッシュ)のが普通です。オープンアドレス法でも衝突は起こり、空いた位置を探すことで対処しています。

解説の中の「連結リスト」

「連結リスト」が出てくる問題(10問)

  1. 上の連結リストをたどる処理が、同じ数の要素をもつ配列を順に読むより大幅に遅くなりやすい理由はどれか。
  2. 配列と比べたときの連結リスト(各要素が次の要素の位置を指すポインタを持つリスト)の特徴として正しいものはどれか。
  3. ハッシュテーブルの衝突を処理する方法として、チェイン法(同じ位置の要素を連結リストでつなぐ)とオープンアドレス法(表の中の空いている別の位置を探す)を比べた説明として正しいものはどれか。負荷率は、格納した要素数を表の大きさで割った値とする。
  4. 要素数が多く、負荷率を0.5程度に保ったハッシュテーブルで、線形探査のオープンアドレス法が、チェイン法(連結リストでつなぐ方法)より速くなりやすい理由として最も適切なものはどれか。
  5. 次のプログラムは、配列 next で要素どうしをつないだ連結リストを、要素番号1の要素から順にたどって出力する。配列の要素番号は1から始まる。next の値0はリストの終わりを表す。出力される値の並びはどれか。
  6. 次のプログラムは、配列 next でつないだ連結リスト A → C → E → D → B の「C」(要素番号3)の直後に、val[6] の「F」を挿入してから、要素番号1の要素から順にたどって出力する。配列の要素番号は1から始まる。next の値0はリストの終わりを表す。出力が A, C, F, E, D, B となるように【a】に入れる処理はどれか。
  7. ハードウェアのプリフェッチが特に効果を発揮しやすいアクセスはどれか。
  8. CASを使ったロックフリーのデータ構造で問題になるABA問題の説明として正しいものはどれか。
  9. GPUで実行すると効率が悪くなりやすい処理はどれか。
  10. 空の二分探索木に、1, 2, 3, …, 1000 の順に値を挿入した(つり合いをとる操作はしない)。この木で1000を探すとき、根から比べ始めて、見つかるまでに比べる節の数はいくつか。

データ構造とアルゴリズムの参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

半導体・電子回路・情報の計算ツール

関連する用語

配列 プリフェッチ ポインタ ハッシュテーブル キャッシュライン 計算量 ロックフリー ABA問題 LR/SC GPU

用語集の一覧へ