𝗙𝗿𝗼𝗻𝘁𝗲𝗻𝗱 𝗟𝗶𝗻𝗲𝗮𝗿 𝗗𝗮𝘁𝗮 𝗦𝘁𝗿𝘂𝗰𝘁𝘂𝗿𝗲𝘀
線形データ構造は、要素をシーケンス(順序)に従って配置します。各要素には、1つの先行要素と1つの後続要素があります。
配列 (Arrays) 配列はJavaScriptにおける主要なツールです。連続したメモリ領域を使用するため、インデックスを指定することで任意の要素に即座にアクセスできます。
- push: 末尾に要素を追加します。
- unshift: 先頭に要素を追加します。他のすべての要素を右に1つずつずらす必要があるため、処理は低速です。
- splice: 任意の場所に要素を追加または削除します。このメソッドは元の配列を変更するため、純粋関数(pure function)ではありません。
注意: 配列が大きくなりすぎると、JavaScriptはより大きなメモリブロックを割り当て、すべての要素をコピーし直す必要があります。これはパフォーマンスの低下を招きます。
スタック (Stacks) スタックはLIFO(Last In, First Out:後入れ先出し)のルールに従います。積み上げられた皿をイメージしてください。一番上からのみ、追加や削除を行います。
- push: 先頭(トップ)に追加します。
- pop: 先頭(トップ)から削除します。
- peek: 要素を削除せずに、先頭(トップ)の要素を確認します。
キュー (Queues) キューはFIFO(First In, First Out:先入れ先出し)のルールに従います。お店の行列をイメージしてください。
- push: 末尾に追加します。
- shift: 先頭から削除します。
警告: 大きなデータセットに対して配列で shift を使用すると低速になります。隙間を埋めるために、すべての要素を左にずらす必要があるからです。大量のデータを扱う場合は、代わりに連結リストを使用してください。
連結リスト (Linked Lists) 連結リストはノードで構成されます。各ノードはデータと、次のノードへのポインタを保持しています。
- メリット: 場所さえ特定できれば、ノードの追加や削除は高速です。ポインタを変更するだけで済みます。
- デメリット: インデックスを指定してジャンプすることはできません。先頭(head)から始めて、ポインタを一つずつ辿る必要があります。これは低速です。
比較まとめ:
- 配列: 頻繁な読み取りや小規模なデータに最適です。アクセスは O(1) です。
- 連結リスト: 頻繁な書き込みや大規模なデータに最適です。ノードの位置がわかっていれば、挿入は O(1) です。
JavaScriptのプロのヒント:
- 配列内でデータ型を混在させないでください。型を統一しておくことで、エンジンが連続したメモリを使用しやすくなります。
- 数値をソートする際は、必ず比較関数(comparator function)を使用してください。
[10, 2].sort()は文字列としてソートされるため、結果は[10, 2]になります。 - ほとんどのネイティブな配列メソッドは、元の配列を破壊的に変更(mutate)することに注意してください。