Chapitre 3 : Structures de données et algorithmes
Julien Reichert
1 Introduction
Une structure de données abstraite, en informatique, se résume à un type muni d’opérations. En quelque sorte, il
s’agit d’un modèle prévu pour rassembler des données avec des spécifications prévues par celui qui la conçoit (et
par celui qui choisit de l’utiliser), ce qui est comparable à un cahier des charges.
L’épithète « abstraite » pour qualifier ce modèle signifie en particulier qu’on peut imaginer toutes sortes de fonction-
nalités pour la structure de données, mais bien évidemment, le but demeure qu’on puisse effectivement se servir du
modèle qu’on conçoit. À titre de comparaison, une machine de Turing est un ordinateur idéal, mais qui ne s’éloigne
de la réalité que par le fait qu’on suppose sa mémoire illimitée, et en physique, assimiler une balle lancée à un point
qui se déplace sans frottements (ou avec des frottements calculés selon une formule simplifiée) donne tout de même
un aperçu de la trajectoire réelle.
Ainsi, une structure de données abstraite efficace est une structure de données abstraite à laquelle on trouve une
application rentabilisant le fait de laisser de côté les structures déjà existantes et plus simple, et pour laquelle on
trouve une implémentation en une structure de données concrètes.
Par exemple, considérons comme structures des ensembles de données issues d’un ensemble ordonné (nombres, n-
uplets de nombres muni d’un ordre quelconque, chaînes de caractères, . . .), avec comme opérations l’accès immédiat
au n-ième plus grand élément, l’insertion, la suppression et la modification. Cette structure s’implémente en un
tableau trié (par exemple). On pourrait imposer dans la structure de données abstraite une complexité pour les
opérations, au risque de rendre difficile voire impossible de réaliser une implémentation (par exemple forcer les trois
dernières opérations à avoir une complexité temporelle constante est peine perdue).
On distingue les structures de données persistantes (ou immutables) des structures de données impératives (ou
modifiables). Appeler les premières « immutables » ne doit pas créer de confusion : on rappelle par exemple que
les entiers, les chaînes de caractères et d’autres objets sont immutables en Python ; de même, en Caml, la notion
de variable étant abusive, les structures immutables sont nombreuses. En pratique, une structure immutable va
conserver une sorte d’historique de ses valeurs (on pourra mentionner le cas des variables entières dans de nombreux
langages qui, lorsqu’elles sont modifiées, vont simplement être redirigées vers une case mémoire contenant leur
nouvelle valeur, la case mémoire précédente contenant encore l’ancienne). Cela s’imagine assez aisément dans le
cas des listes en Caml (dites listes [simplement] chaînées, puisqu’une liste est vide ou un élément qui s’enchaîne
avec une autre liste 1), car si on modifie ou retire l’élément de tête, cet ancien élément peut encore s’enchaîner avec
le reste de la liste, mais plus rien ne pointe sur lui-même 2. Quand aux structures impératives, comme leur nom
l’indique, ce sont aussi celles qui sont les plus adaptées à la programmation impérative : autant le répéter, ce sont
par exemple les tableaux et les chaînes de caractères en Caml.
1. Les listes doublement chaînées, quant à elles, ont leurs éléments qui s’enchaînent avec les listes des prédécesseurs et des successeurs
2. Et le ramasse-miettes menace !
1