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


32

これらの用語を理解することは私にとって非常に困難です。私はグーグルで検索し、ウィキペディアで少し読みましたが、まだわかりません。私はこれまでのところ以下を決定しました:

抽象データ型は新しい型の定義であり、そのプロパティと操作を説明します。

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

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




回答:


24

簡単に言えば、ADT(Abstract Data Type)はより論理的な記述であり、データ構造は具体的です。

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

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


ただし、アルゴリズム内にStackとQueue(ADT)も実装できます。いや?
フェデリコ

スタックとキューは、特定のコンピューターサイエンスの意味を持つ論理的な表現です。ただし、C#、Java、Go、または[言語に名前を付ける]でのキューの実装は少し異なります。キューの概念はADTです。Javaキューはデータ構造です。C#スタックの実装でも同じです。
ベリン・ロリッチ

53

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

いくつかの例:

ADT: List
DS:  ArrayList, LinkedList...

ADT: Map
DS:  HashMap, TreeMap...

あなたはポイントを得ると思います。


ADTは、データ構造の一般的なタイプと言えますか?
オワイスQureshi

1
これはマークされた答えである必要があります。それは素人にとってもっと簡単だとは言えませんでした。
-deppfx

@dagneliesにシンプルで効果的な回答をありがとう。これは回答としてマークする必要があります。
SARUN英国の

1
理由は定かではありませんが、ここの言葉遣いでは小さな再配置を好みますADT is to a Data Structure, what an Interface (what it does) is to a Class (how it does it)。例はスポットオンです。
アディティアMP

10

抽象データ型:ADTは、特定の実装とは無関係に正確に指定されたデータ値と関連操作のセットとして定義できます。したがって、抽象データ型は、組織化された情報のコレクションと、その情報を管理するために使用される一連の操作です。操作のセットは、ADTのインターフェースを定義します。ADTがインターフェイスの条件を満たしている限り、ADTの実装方法は重要ではありません。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. コンポーネントが相互にどのように関係し、構造全体に関係するかに関する規則を定義します(アサーション)。

データ構造:

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

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


0

まず、データ構造の用語は非常にわかりにくい場合があります。

ADTは、データ構造の動作方法、サポートする操作の種類などを示す理論、モデル、またはガイドラインなどに似ています。3つの基本的な抽象データ型は、コンテナ、辞書、優先度キューです。辞書の例では、この辞書ADTを実装するすべてのデータ構造は、キーと値のペア、キーに基づく検索、アイテムの挿入、特定のキーの後続および先行の検索などをサポートする必要があることを示しています。

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

誰かが自分のDSをADTと名付けると本当の混乱が生じると思います。たとえば、一部の人々は前述のDSを完全に合法的なDictImplementationではなく「Dictionary」と呼びます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.