Quelle est la relation entre les structures de données et les algorithmes? [fermé]

13

Je cherchais un bon cours en ligne sur les structures de données, mais j'ai constaté que Google renvoie également des résultats pour les cours d'algorithmes, qui disent des choses comme:

Dans ce cours, vous apprendrez plusieurs principes fondamentaux de la conception d'algorithmes: méthodes de division et de conquête, algorithmes de graphes, structures de données pratiques (tas, tables de hachage, arbres de recherche) , algorithmes aléatoires, etc. [la source]

et

À la fin de ce cours, vous comprendrez les concepts clés nécessaires pour concevoir de nouveaux algorithmes pour les graphiques et autres structures de données importantes et pour évaluer l'efficacité de ces algorithmes. [la source]

et

Ce cours fournit une introduction à la modélisation mathématique des problèmes de calcul. Il couvre les algorithmes courants, les paradigmes algorithmiques et les structures de données utilisés pour résoudre ces problèmes . [la source]

Ma question est la suivante: les algorithmes et les structures de données sont-ils intimement liés, ce qui signifie qu'ils doivent être compris ensemble ou est-ce qu'un sujet est plus fondamental que l'autre?

EDIT: Pour ceux qui votent pour clore cette question, pouvez-vous s'il vous plaît me dire pourquoi et peut-être comment améliorer celle-ci? Apprendre à poser les bonnes questions fait partie du processus éducatif.

gwg
la source
17
Une structure de données est statique et ne peut rien faire. Un algorithme n'est qu'un ensemble d'instructions à exécuter sur certaines données. Sans l'un, l'autre est inutile. Ensemble, ils créent des programmes informatiques. Ils sont tous les deux fondamentaux.
Phoshi
2
@Phoshi Wrong. La structure des données est étroitement liée aux algorithmes qui manipulent les données. Si étroitement liés, ces algorithmes sont considérés comme faisant partie de la structure des données. Par exemple, la structure de données Lined List vous indique comment les données sont enregistrées et comment elles sont lues et manipulées.
Euphorique
7
@ Euphoric Je dirais qu'il est faux de dire que les algorithmes font partie de la structure des données. Il existe plus d'une façon d'implémenter une recherche binaire: vous pouvez, par exemple, faire la if less than recurse to the left; if greater than, recurse to the right; if equal, returnrecherche naïve ou légèrement plus sophistiquée if less than recurse to the left; otherwise keep track of this value as a potential candidate and recurse to the right; check for equality once we reach the leaves. Ils ont des nombres de comparaisons légèrement différents. Les deux sont l'une des nombreuses choses que vous pourriez choisir de faire avec un arbre.
Doval
4
@Euphoric Vous confondez la structure de données avec le type de données abstrait que la combinaison de structure de données et d'algorithmes implémente.
Doval
7
@ Euphoric, je dois être en désaccord. le tri par fusion est un algorithme. Un tableau est une structure de données. Une liste chaînée est une structure de données différente. Je peux écrire une implémentation de MergeSort pour fonctionner sur l'un ou l'autre. Certaines structures de données peuvent être plus naturelles ou plus efficaces pour un algorithme particulier, mais c'est rarement une exigence absolue (vous devez à peu près avoir un tas pour implémenter le tri de tas). Nicholas Wirth a écrit un livre populaire dans les années 1980 intitulé: "Algorithmes + Structures de données = Programmes"
Charles E. Grant

Réponses:

20

Toutes sortes de mélanges existent. Vous avez des structures de données, qui ne sont pas associées à des algorithmes, des algorithmes, qui ne nécessitent pas de structures de données (réelles), mais le plus souvent, les deux viennent dans un seul paquet.

Edit: comme @Doval l'a correctement souligné, les structures de données en elles-mêmes n'ont aucune opération associée. L'acte de combiner la structure des données et l'algorithme forme un type de données abstrait.

Structures de données sans algorithmes

Considérons par exemple une structure de données pour stocker des coordonnées bidimensionnelles, appelée de manière appropriée Point. Il n'y a pas grand-chose en termes d'algorithmes à faire pour un point et c'est vraiment juste un conteneur pour un xet une yvaleur. Bien sûr, en donnant cette structure de données, vous pouvez maintenant ajouter toutes sortes d'algorithmes par-dessus (calcul de la distance, coques convexes, ce que vous avez).

Vous pouvez penser à de nombreuses structures de données, qui sont simplement une accumulation de données individuelles. Bien que ceux-ci se produisent fréquemment dans la pratique, ils ne constituent pas un bon matériel pédagogique, car il n'y a rien à en tirer, une fois que vous avez compris, que des éléments de données uniques peuvent être accumulés dans une nouvelle structure de données (comme ce que vous apprenez après l' Pointexemple ci-dessus , si je vous fournis cette impressionnante structure de données appelée Point3D, qui peut faire la même chose pour un espace en 3 dimensions?)

Algorithmes sans structures de données (réelles)

"Réel", car évidemment chaque algorithme intéressant a besoin de types de données primitifs comme des entiers ou des booléens, et nous ne voulons pas les considérer comme des structures de données dans ce contexte. De la même manière que ci-dessus, ces algorithmes sont généralement assez simples. En particulier, ils ne viennent pas avec un état compliqué d'aucune sorte, car cela va généralement dans une structure de données (voir la section suivante).

Un exemple d'un tel algorithme serait de calculer le plus grand diviseur commun de deux nombres. Les algorithmes d'Euklid pour le gcd n'ont vraiment besoin que de deux entiers et les manipulent.

Une fois que les choses commencent à devenir plus intéressantes, vous entrez très bientôt dans le monde des types de données abstraits. Par exemple, le tamis d'Eratosthène est basé sur un tableau. Nous pourrions avoir une discussion maintenant, si un tableau est encore primitif, ou en fait, vous pourriez discuter si un entier n'est pas déjà une structure de données. De toute façon, les algorithmes qui existent complètement sans structures de données sont plutôt ennuyeux, même si vous acceptez leur existence isolée.

Algorithmes combinés avec des structures de données, aussi appelés types de données abstraits

Maintenant, ce sont les plus intéressants, mais pour deux raisons très différentes. En règle générale, vous pouvez les aborder dans deux directions: la structure des données d'abord ou l'algorithme d'abord.

Alors qu'un type de données abstrait est défini par la combinaison de structure de données + algorithmes / opérations, nous les considérons souvent avec un accent sur l'un de ceux-ci et considérons l'autre comme des catalyseurs.

Structure des données, puis algorithme

Vous rencontrerez des types de données abstraits, assez simples à utiliser, mais qui impliquent des algorithmes plus ou moins compliqués pour les faire fonctionner en interne. Par exemple, a HashMapest trivial à utiliser, mais implique une fonction de hachage astucieuse et traitant des collisions de hachage à l'intérieur. Pourtant, de votre point de vue en tant qu'utilisateur, vous vous souciez de cela comme quelque chose qui contient des données pour vous, pas quelque chose qui fait quelque chose pour vous.

Contrairement au dernier groupe ci-dessous, ces structures de données n'exposent pas leurs utilisateurs à ces algorithmes. Vous n'avez pas besoin de connaître ni de vous soucier de HashMapla fonction de hachage interne pour pouvoir l'utiliser. (Pour l'utiliser efficacement, vous voudrez peut-être savoir ces choses;)

Algorithme, puis structure des données

L'autre direction signifie que vous avez un algorithme, que vous voulez pouvoir utiliser simplement, mais qui a besoin de structures de données en interne pour le faire fonctionner comme prévu. Un exemple serait un algorithme de partitionnement d'espace binaire (BSP), que vous pouvez simplement demander pour les 2 dimensions Pointd'un grand ensemble de points qui est le plus proche d'un point de requête donné. Cependant, vous avez besoin d'une structure arborescente (et même d'algorithmes supplémentaires comme les calculs de distance) à l'intérieur pour réellement écrire l'algorithme.

En général, on peut dire que les algorithmes de ce groupe utilisent des structures de données impliquées pour leur représentation d'état interne. Je dirais que ce groupe d'algorithmes est le plus diversifié et vous en trouverez de nombreux différents qui correspondent à ce schéma général. En ce qui concerne le point de vue, nous les considérons comme intéressants, car ils font quelque chose (tri par exemple) pour nous, et ne se soucient pas autant de la partie contenant les données.

Structures de données et algorithmes étroitement liés

Enfin, vous disposez de structures de données, très proches des algorithmes qui leur correspondent directement. Un exemple typique est un arbre binaire qui, lorsque vous voulez faire quoi que ce soit de significatif avec lui, vous impose le sujet des algorithmes d'arborescence (profondeur d'abord, largeur d'abord, peu importe).

Pour ces cas, nous modifions de temps en temps notre vision des types de données abstraits résultants. Parfois, vous vous souciez de la structure de votre arbre, quelques minutes plus tard, vous vous souciez de pouvoir exécuter une opération de recherche sur celui-ci, puis vous vous interrogez sur la suppression d'un nœud, et tout de suite sur l'aspect de la structure par la suite. Bien que tout cela soit également vrai pour les autres sections ci-dessus, ce n'est pas quelque chose qui vous intéresse principalement, par exemple, lorsque vous stockez / récupérez des données vers / depuis un Map, ou lorsque vous triez une liste liée.

Franc
la source
1
Vous confondez des structures de données et des types de données abstraits. Une structure de données ne fait rien . Cela n'a aucun sens de dire "vous rencontrerez des structures de données, qui sont plutôt simples à utiliser" car une structure de données n'est qu'une structure. A Mapest un type de données abstrait qui peut être implémenté en utilisant une structure de données particulière et un ensemble d'algorithmes qui produisent les résultats souhaités en parcourant et en manipulant la structure. La structure des données ne cache pas les algorithmes, car elle n'en a pas; le type de données abstrait cache la structure des données (c'est ce qui le rend abstrait.)
Doval
Notez que dans un sens, les algorithmes sont toujours cachés car il n'y a aucun moyen d'inspecter les fonctions. C'est probablement pourquoi elles sont appelées abstractions dans le calcul lambda (dont le seul type de données est les fonctions).
Doval
2
Vous avez raison. Néanmoins, je vois une distinction entre la façon dont nous considérons les différents ADT. J'ai modifié ma réponse et j'espère qu'elle est plus claire maintenant et ne confond plus la structure avec les ADT, tout en soulignant que vous pouvez vous concentrer sur la structure et / ou les opérations pour n'importe quel ADT.
Frank
Est-il vraiment trop simple de dire que les structures de données sont des noms et que les algorithmes sont des verbes? Je suppose que vous pourriez dire que l'algorithme est l'implémentation du verbe, mais vous recherchez toujours un arbre , même si cette recherche est une recherche binaire. Vous manqueriez tous les détails techniques en le disant, mais cela a une certaine élégance.
Magus
@Doval: Même si une structure de données qui consiste simplement en un groupe de nombres dans un tableau qui doivent avoir et maintenir une certaine relation les uns avec les autres, une telle chose peut être "facile à utiliser" s'il est facile de maintenir les invariants requis tout en faisant ce que l'on veut, ou "difficile à utiliser" si c'est difficile.
supercat
5

Les structures de données influencent souvent les détails d'un algorithme. Pour cette raison, les deux vont souvent de pair.

Prenons par exemple un algorithme pour couper votre pelouse. La façon dont vous coupez votre pelouse est susceptible d'être influencée par la structure réelle de votre pelouse. Si vous vivez dans une petite maison dans une banlieue densément peuplée et que votre pelouse n'est qu'un petit rectangle de quelques mètres carrés, vous préféreriez probablement couper votre pelouse avec une tondeuse à pousser plutôt qu'avec un tracteur / tondeuse autoportée. Si votre pelouse comprend plusieurs acres de prairie plate, votre préférence peut être pour la tondeuse autoportée plutôt que pour la tondeuse à poussée (bien que l'une ou l'autre tondeuse puisse éventuellement faire le travail). Si votre pelouse comprend des hectares de terrain avec de grandes zones plates, mais quelques petites collines et un certain nombre d'arbres, vous pouvez développer un algorithme plus intéressant pour couper la pelouse qui implique à la fois une tondeuse autoportée et une tondeuse à pousser, ou une autre herbe techniques de coupe.

En fin de compte, la structure de vos données peut avoir un impact significatif sur vos décisions concernant la façon de développer votre algorithme (ou les algorithmes à utiliser). Pour cette raison, les deux sujets vont souvent de pair.

Et vice versa: parfois l'algorithme que nous voulons utiliser influence (au moins au début de l'informatique) les structures de données que vous développez pour prendre en charge l'algorithme. Par exemple, passer d'une liste de tableaux à l'idée d'une liste liée et éventuellement à un BST pour stocker une liste ordonnée qui permettra une recherche rapide.

YoungJohn
la source