2022-11-05 連結リストの使い所
連結リストどういうときに使うと有効かなーと考えていたときに下記の記事が参考になった。
連結リスト(LinkedList)の使い所 - KAYAC engineers’ blog
配列と辞書で何か足りない時は、連結リストという選択肢も持っていると良いと思います。 「入れた順にアクセスしたい辞書」は一つの例です。
また、下記のデータ構造の選択肢の整理が参考になった。
- 固定サイズ配列(Array): 最初にこれで足りないか考える
- 可変サイズ配列(List): 個数可変ならこっちにするが、必要な操作が限られているならキューかスタックを検討する
- キュー(Queue): 途中に触る必要がなく、入れた順に出すならこれ
- スタック(Stack): 何かをプールしとく時は大抵これ。可変サイズ配列の類では一番制約が厳しいのでバグりにくく速い。
- 連結リスト(LinkedList): すでに他のデータ構造に入ってるものに順序をつけたい時にこれを併用する
- ハッシュ(Dictionary): 検索が必要な時の第一選択
- キーだけのハッシュ(HashSet): DictionaryでValueがいらない時。単にダブリを消したい時なら配列でソートする方がメモリを汚さない。
- 探索木(SortedDictionary): キーの順序でループしたい辞書、といえばこれ。
- 木: 子の配列を持つより、「最初の子と次の兄弟」形式の方が大抵は効率がいい。親の参照は不要なら持たない方がいい。
- ヒープ: 何かをプールする時に、何かの値で順序をつけたい時にはStackでなくこっち。
連結リスト vs 配列
連結リストと配列の比較。下記記事より引用。
配列で要素を挿入、削除するときに、連続しているメモリーを使っているため、挿入・削除インデックス以降のデータのシフトコストがかかります。例えば、配列の冒頭(index=0)にデータを挿入しようとすると、全てのデータを1ずつずらす必要があります。この操作がO(n)となってしまいます。それに対して、連結リストではポインターの指すメモリーアドレスを変えれば良いので、O(1)で操作可能となります。
操作 配列 連結リスト 探索 O(1) O(n) 挿入 O(n) O(1) 削除 O(n) O(1)