Il m'est assez difficile de comprendre ces termes. J'ai cherché sur google et lu un peu sur Wikipedia mais je ne suis toujours pas sûr. J'ai déterminé jusqu'à présent que:
Abstract Data Type est une définition d'un nouveau type, décrit ses propriétés et ses opérations.
Data Structure est une implémentation d'ADT. De nombreux ADT peuvent être implémentés comme la même structure de données.
Si je pense bien, tableau comme ADT signifie une collection d'éléments et comme structure de données, comment il est stocké dans une mémoire. La pile est ADT avec des opérations Push, pop, mais pouvons-nous dire à propos de la structure des données de la pile si je veux dire que j'ai utilisé la pile implémentée comme un tableau dans mon algorithme? Et pourquoi le tas n'est-il pas ADT? Il peut être implémenté sous forme d'arbre ou de tableau.
Autrement dit, un ADT (Abstract Data Type) est plus une description logique, tandis qu'une structure de données est concrète.
Considérez un ADT comme une image des données et des opérations pour les manipuler et les modifier.
Une structure de données est le la vraie chose concrète. Il peut être implémenté et utilisé dans un algorithme.
ADT est à une interface (ce qu'il fait) ce qu'est une structure de données à une classe (comment il le fait).
Quelques exemples:
ADT: List
DS: ArrayList, LinkedList...
ADT: Map
DS: HashMap, TreeMap...
Je suppose que vous comprenez.
Type de données abstrait: ADT peut être défini comme un ensemble de valeurs de données et d'opérations associées qui sont spécifiées avec précision indépendamment de toute mise en œuvre particulière. Ainsi, un type de données abstrait est une collection organisée d'informations et un ensemble d'opérations utilisées pour gérer ces informations. L'ensemble des opérations définit l'interface de l'ADT. Tant que l'ADT remplit les conditions de l'interface, peu importe comment l'ADT est implémenté. Étant donné que dans ADT, les valeurs des données et les opérations sont définies avec une précision mathématique plutôt que comme une implémentation dans un langage informatique, nous pouvons raisonner sur les effets des opérations, les relations avec d'autres types de données abstraits si un programme implémente le type de données, etc. L'un des types de données abstraits les plus simples est le type de données de pile pour lequel des fonctions peuvent être fournies pour créer une pile vide, pousser des valeurs sur une pile et extraire des valeurs d'une pile.
La différence fondamentale entre le type de données abstrait (ADT) et le type de données concret est que ces derniers nous permettent de regarder la représentation concrète, tandis que les premiers nous cachent la représentation. Un ADT peut être pur ADT ou ADT modifiable. Un ADT pur est celui où toutes les opérations sont de pures fonctions. Cela signifie que les opérations n'ont pas d'effets secondaires. En particulier, ils n'y modifient ni ne mettent à jour les arguments d'entrée. Ils utilisent simplement ces arguments pour générer une sortie, qui sont de nouvelles valeurs d'ADT (ou d'autres types). La plupart des types de béton sont purs. Par exemple, aucune opération sur des entiers ne modifie réellement un entier. Au lieu de cela, toutes les opérations comme ‘+’ produisent de nouvelles sorties.
Un ADT pouvant être mis à jour est celui où certaines opérations modifient réellement les valeurs de l'ADT. Par exemple, supposons que nous ayons eu une opération appelée "pop" qui a pris une pile comme argument et l'a modifiée. ("En place", "destructivement") en supprimant l'élément de priorité la plus élevée. Cette opération serait considérée comme impure et l'ensemble de l'ADT serait également impur. Un ADT peut être ADT défini par l'utilisateur.
Nous savons qu'un type de données abstrait est un type de données qui satisfait aux deux conditions suivantes:
La représentation, ou définition, du type et les opérations sont contenues dans une seule unité syntaxique.
La représentation des objets du type est masquée des unités de programme qui utilisent le type. Par conséquent, seules les opérations directes possibles sur ces objets sont celles fournies dans la définition du type.
Un type de données abstrait défini par l'utilisateur doit fournir:
Une définition de type qui permet aux unités de programme de déclarer des variables du type, mais masque la représentation de ces variables.
Un ensemble d'opérations pour manipuler des objets du type.
Un exemple de type de données abstrait défini par l'utilisateur est la structure. ‘C’ propose quatre types de base: int, char, float et double. Cependant, "C" donne également au programmeur la possibilité de définir ses propres types. La structure en est un exemple. Une structure est un agrégat de différentes parties, chaque partie étant d'un type existant.
struct abc
{int x;
float y;
};
La définition de structure ci-dessus ne crée aucune variable, mais crée plutôt un nouveau type. Les variables de ce type peuvent être créées de la même manière que les variables d'un type intégré.
struct abc a;
Le mot-clé typedef nous permet de créer de nouveaux noms de types pour nos nouveaux types.
Par exemple:
typedef struct abc AB;
où AB est un nouveau nom de type qui peut désormais être utilisé pour créer de nouveaux types.
AB b;
Structures de données: Voici les caractéristiques des structures de données:
Il contient des éléments de données de composants, qui peuvent être atomiques ou une autre structure de données (toujours un domaine).
Un ensemble d'opérations sur un ou plusieurs des éléments de composant.
Définit des règles sur la façon dont les composants sont liés les uns aux autres et à la structure dans son ensemble (assertions).
Structures de données:
Une structure de données peut être statique ou dynamique. Une structure de données statique a une taille fixe. Cette signification est différente de la signification du modificateur statique. Les tableaux sont statiques; une fois que nous avons défini le nombre d'éléments qu'il peut contenir, le nombre ne change pas. Une structure de données dynamique croît et se rétrécit au moment de l'exécution, comme l'exige son contenu. Une structure de données dynamique est implémentée à l'aide de liens.
Les structures de données peuvent en outre être classées en structures de données linéaires et structures de données non linéaires. Dans les structures de données linéaires, chaque composant a un prédécesseur et un successeur uniques, à l'exception des premier et dernier éléments, tandis que dans le cas des structures de données non linéaires, aucune restriction de ce type n'existe car les éléments peuvent être disposés de la manière souhaitée restreinte par la façon dont nous les utilisons pour représentent de tels types.
Tout d'abord, les terminologies dans les structures de données peuvent être très déroutantes.
ADT est comme théorie ou modèle ou directive etc. qui indique comment une structure de données doit se comporter, quel type d'opérations elle doit prendre en charge, etc. Trois types de données abstraits fondamentaux sont les conteneurs, les dictionnaires et les files d'attente prioritaires. Par exemple, dictionnaire, il nous dit que chaque structure de données qui implémente ce dictionnaire ADT doit prendre en charge les paires clé-valeur, la recherche basée sur les clés, l'insertion d'éléments, la recherche du successeur et du prédécesseur d'une clé donnée, etc. .
Maintenant, tout le reste qui implémente cela au-dessus d'ADT est Structure de données (DS), La structure de données est de vraies choses que vous implémentez dans vos problèmes et que vous trouvez dans les bibliothèques. En cas de dictionnaire, vous pouvez choisir de l'implémenter via un tableau ou une liste liée.
Je pense que la vraie confusion survient lorsque quelqu'un nomme son DS ADT, par exemple certains les gens appelleront leur DS comme "Dictionnaire" au lieu de DictImplementation qui est parfaitement légal, cela cause juste une certaine confusion.
Ref: Skiena: Le manuel de conception d'algorithmes