
コンピュータサイエンスにおいて、データ構造とは、通常、効率的なデータアクセスを目的として選択される、データを整理して格納する方法です。[ 1 ] [ 2 ] [ 3 ]より正確には、データ構造とは、データの編成と格納形式の仕様、およびこのデータを操作する関数や操作を含む、データ型の物理的な実装です。データ構造は、抽象データ型(ADT)と密接に関連しています。[ 4 ]データ構造は、メモリ内のデータの表現と操作の実行方法を記述しますが、ADTは、データ型の論理形式または代数構造(どのような操作が許可され、どのような結果を生成するか)を記述しますが、それらの操作がどのように実装されるかは記述しません。 [ 4 ]一部の著者は「抽象データ型」という用語を使用せず、単にデータ構造の論理形式と物理形式に言及します。[ 5 ]
効率的なデータ構造は、大規模なデータセットを管理するために不可欠であり、アルゴリズム設計の基礎となります。リレーショナルデータベースでは、データ検索に一般的にB ツリーインデックスが使用され、 [ 6 ]コンパイラの実装では通常ハッシュ テーブルを使用して識別子を検索します。[ 7 ]ファイルシステムや検索エンジンでは、特殊なデータ構造が広く使用されています。[ 8 ] [ 9 ] Rob Pike は、アルゴリズムは自明であることが多いため、データ構造の選択はアルゴリズムの選択よりも効率に大きな影響を与えることがほとんどであると述べています。[ 10 ]データ構造は、主記憶装置 ( RAM ) と二次記憶装置 (ディスクなど)の両方でデータを整理するために使用されます。 [ 11 ]
データ構造を実装するには、その構造のインスタンスを作成および操作するサブルーチン(挿入、削除、走査、検索など)のセットを作成する必要があります。データ構造は、さまざまなプログラミング言語と手法を使用して実装できます。データ構造は、特定の実装とは独立して動作と操作を記述するADTとは対照的に、単一の具体的な実装に直接対応します。同じADTに対して複数の具体的なデータ構造が存在する場合があります。たとえば、リストADTの場合は、リンクリストまたはサイズ変更可能な配列です。[ 12 ]そのため、データ構造の効率は具体的な実装に密接に関連しており、ベンチマークと理論シミュレーションによって評価する必要があります。[ 13 ]
データ構造は一般的に、メモリ アドレス(ポインタ(ビット列)で指定されるか、より抽象的には参照によって指定される)を介してデータを格納およびアクセスするコンピュータの機能に依存しており、そのアドレス自体をメモリに格納してプログラムで操作することができます。たとえば、配列やレコードは要素を連続したメモリ位置に格納するため、厳密なレイアウトが必要ですが、算術演算によってアドレスを計算することで高速なインデックスアクセスが可能になります。対照的に、リンクされたデータ構造(リンク リストやツリーなど) は、関連する要素のアドレスを構造内に格納するため、柔軟なメモリ使用と動的なサイズ変更が可能になります。これらの異なるデータ構造化方法にはそれぞれ異なるトレードオフがあり、異なるタスクに適しています。たとえば、配列における連続したメモリ割り当ては、高速なアクセスと変更操作を容易にし、シーケンシャルなデータ処理シナリオでのパフォーマンスを最適化します。[ 14 ]

データ構造には多くの種類があり、一般的にはより単純な基本データ型に基づいて構築されています。よく知られている例としては、[ 15 ]などがあります。
ほとんどのアセンブリ言語と、 BCPL (Basic Combined Programming Language)などの一部の低レベル言語には、データ構造の組み込みサポートがありません。一方、多くの高レベルプログラミング言語と、 MASMなどの一部の高レベルアセンブリ言語には、レコードや配列などの特定のデータ構造に対する特別な構文やその他の組み込みサポートがあります。たとえば、C (BCPL の直接の子孫) とPascal言語は、ベクトル (1 次元配列) と多次元配列に加えて、それぞれ構造体とレコードをサポートしています。 [ 17 ] [ 18 ]
ほとんどのプログラミング言語には、データ構造の実装を異なるプログラム間で再利用できるようにするライブラリ機構が備わっています。現代の言語には通常、最も一般的なデータ構造を実装した標準ライブラリが付属しています。例としては、C++標準テンプレートライブラリ、Javaコレクションフレームワーク、Microsoft .NETフレームワークなどがあります。
現代のプログラミング言語は一般的にモジュール型プログラミング、つまりライブラリモジュールのインターフェースとその実装の分離をサポートしています。一部の言語は、クライアントが実装の詳細を隠蔽できる不透明なデータ型を提供しています。C ++、Java、Smalltalkなどのオブジェクト指向プログラミング言語は、通常この目的でクラスを使用します。
多くの既知のデータ構造には、複数の計算スレッドがデータ構造の単一の具体的なインスタンスに同時にアクセスできるようにする並行バージョンがあります。 [ 19 ]
データ構造とは、データへのアクセスや変更を容易にするために、データを保存および整理する方法のことです。
アルゴリズムの効率向上、例えばキュー、スタック、リンク リスト、ヒープ、辞書、ツリーなどの情報、または人の名前と住所などの概念的な統一性のために、通常はメモリ上に整理された情報。リストの長さやサブツリーのノード数などの冗長な情報が含まれる場合がある。
効率的な検索と取得のためにデータが格納される方法。
アルゴリズムの動作パターンまたはパフォーマンスプロファイルは、アルゴリズムの処理中に消費される計算時間と空間の観点から測定されます。