web-dev-qa-db-ja.com

抽象データ型とデータ構造

これらの用語を理解することは私にとって非常に困難です。私はグーグルで検索し、ウィキペディアで少し読んだが、それでもよくわからない。私はこれまでに次のことを決定しました。

Abstract Data Typeは新しいタイプの定義であり、そのプロパティと操作を説明します。

データ構造はADTの実装です。多くのADTは同じデータ構造として実装できます。

私が正しく考えると、ADTとしての配列は要素のコレクションを意味し、データ構造としては、メモリに格納される方法を意味します。スタックはプッシュ、ポップ操作を備えたADTですが、自分のアルゴリズムで配列として実装されたスタックを使用したとしたら、スタックデータ構造について言うことができますか?そして、なぜヒープがADTではないのですか?ツリーまたは配列として実装できます。

36
user42183

簡単に言うと、ADT(Abstract Data Type)はより論理的な説明であり、データ構造は具体的です。

ADTは、データとそれを操作および変更するための操作の画像と考えてください。

データ構造は実際の具体的なものです。アルゴリズム内で実装および使用できます。

27
Dynamic

ADTはインターフェースに対するものです(それがすること)データ構造はクラスに対するものです(それがする方法)。

いくつかの例:

ADT: List
DS:  ArrayList, LinkedList...

ADT: Map
DS:  HashMap, TreeMap...

要点はわかると思います。

58
dagnelies

抽象データ型:ADTは、特定の実装とは無関係に正確に指定される一連のデータ値および関連する操作として定義できます。したがって、抽象データ型は、情報の整理されたコレクションと、その情報を管理するために使用される一連の操作です。操作のセットは、ADTのインターフェースを定義します。 ADTがインターフェースの条件を満たす限り、ADTがどのように実装されているかは重要ではありません。 ADTでは、データ値と操作はコンピューター言語での実装としてではなく、数学的精度で定義されているため、操作の影響、他の抽象データ型との関係について、プログラムがデータ型を実装するかどうかについて推論する場合があります。最も単純な抽象データ型の1つは、空のスタックを作成したり、スタックに値をプッシュしたり、スタックから値をポップしたりするための関数が提供される可能性のあるスタックデータ型です。

抽象データ型(ADT)と具象データ型の基本的な違いは、後者では具象表現を見ることができるのに対し、前者では表現を非表示にすることです。 ADTは、純粋なADTまたは更新可能なADTの場合があります。純粋なADTは、すべての操作が純粋な関数であるものです。つまり、操作には副作用がありません。特に、これらは入力引数を変更または更新しません。これらの引数を使用して出力を生成します。これは、ADT(または他のタイプ)の新しい値です。ほとんどの具象型は純粋です。たとえば、整数に対する演算は実際には整数を変更しません。代わりに、「+」などのすべての演算は新しい出力を生成します。

更新可能なADTは、一部の操作が実際にADTの値を変更するADTです。たとえば、スタックを引数として取り、それを変更する「pop」という操作があるとします。 (「適所」、「破壊的」)優先度の最も高いアイテムを削除します。この操作は不純と見なされ、ADT全体も不純になります。 ADTはユーザー定義のADTです。

抽象データ型は、次の2つの条件を満たすデータ型であることがわかっています。

  1. タイプと演算の表現または定義は、単一の構文単位に含まれています。

  2. タイプのオブジェクトの表現は、タイプを使用するプログラム単位から隠されているため、それらのオブジェクトで可能な直接操作のみがタイプの定義で提供されます。

ユーザー定義の抽象データ型は、以下を提供する必要があります。

  1. プログラム単位が型の変数を宣言できるようにするが、これらの変数の表現を隠す型定義。

  2. タイプのオブジェクトを操作するための一連の操作。

ユーザー定義の抽象データ型の例は構造です。 ’C’には、int、char、float、doubleの4つの基本タイプがあります。ただし、「C」は、プログラマーに自分のタイプを定義する機能も提供します。構造はその一例です。構造はさまざまなパーツの集合体であり、各パーツはいくつかの既存のタイプです。

struct abc

{int x;

float y;

};

上記の構造定義は変数を作成せず、新しいタイプを作成します。このタイプの変数は、組み込みタイプの変数と同様の方法で作成できます。

struct abc a;

Typedefキーワードを使用すると、新しいタイプの新しいタイプ名を作成できます。

例えば:

typedef struct abc AB;

ここで、ABは、新しいタイプの作成に使用できる新しいタイプ名です。

AB b;

データ構造:データ構造の特徴は次のとおりです。

  1. これには、アトミックまたは別のデータ構造(まだドメイン)のコンポーネントデータ項目が含まれます。

  2. 1つ以上のコンポーネントアイテムに対する一連の操作。

  3. コンポーネントが相互にどのように関連し、全体として構造に関連しているか(アサーション)に関するルールを定義します。

データ構造:

データ構造は静的または動的です。静的データ構造のサイズは固定されています。この意味は、静的修飾子の意味とは異なります。配列は静的です。保持できる要素の数を定義すると、その数は変わりません。動的データ構造は、その内容に応じて、実行時に拡大および縮小します。動的データ構造はリンクを使用して実装されます。

データ構造はさらに、線形データ構造と非線形データ構造に分類されます。線形データ構造では、最初の要素と最後の要素を除いて、すべてのコンポーネントに一意の先行要素と後続要素がありますが、非線形データ構造の場合、使用する方法によって制限された任意の方法で要素を配置できるため、そのような制限はありません。そのようなタイプを表します。

12
Manoj Agarwal

まず第一に、データ構造の用語は非常に混乱する可能性があります。

[〜#〜] adt [〜#〜]理論またはモデルまたはガイドラインに似ていますデータ構造がどのように動作するか、どのような操作をサポートする必要があるかなどを通知します。3つの基本的な抽象データ型は、コンテナ、辞書、優先度キューです。たとえばディクショナリの場合、このディクショナリADTを実装するすべてのデータ構造は、キーと値のペア、キーに基づく検索、アイテムの挿入、指定されたキーの後続および先行の検索などをサポートする必要があることを通知します。

これで、上記のADTを実装する他のすべてはデータ構造(DS)です。データ構造は、問題に実装し、ライブラリ内で見つける実際のものです。辞書の場合、配列またはリンクリストを介して実装することを選択できます。

実際のconfusionは、誰かがDSをADTと名付けたとき人々は前述のDSを、完全に合法であるDictImplementationの代わりに 'Dictionary'と呼びます。これは混乱を招くだけです。

参照:Skiena:アルゴリズム設計マニュアル

2
humble_wolf