MatheX – Licence CC BY-NC-SA 4.0 - https://www.mathexien.com
Objectifs:
- Introduire le concept de structure de données abstraite
- Découvrir les principales structures de données linéaires
- Réaliser différentes implémentations de ces structures
En théorie de l'informatique, on étudie des algorithmes définient en langage naturel ou en pseudo-code en dehors de la considération des choix d'implémentation et donc en dehors des spécificités techniques d'un langage de programmation.
Ces algorithmes s'appuient sur des modèles théoriques d'organisation et d'interactions de données, les structures de données abstraites.
Une structure de données abstraite définit :
une organisation des données:
des interfaces (primitives) pour la manipuler:
On va étudier ici des structures de données abstraites linéaires classiques et dans de prochains chapitres les autres.
Une liste (list ou sequence) est une structure de données abstraite linéaire:
creeListe()
: crée une liste videinsereTeteListe(liste, valeur)
: ajoute la valeur spécifiée en tête de listesupprimeTeteListe(liste)
: supprime la tete de la liste et renvoie sa valeurteteListe(liste)
: renvoie la tête de liste (élément)queueListe(liste)
: renvoie la queue de liste (liste)estListeVide(liste)
: renvoie True
si la liste est vide, False
sinontailleListe(liste)
: renvoie le nombre d'élément de la liste( surcharge de__len__(self)
en objet)Utiliser les primitives pour créer la liste : $(\,1\,;\, 2\,;\, 3\,;\, 4\,)$
Utiliser les primitives pour modifier la liste pour obtenir: $(\,2\,;\, 3\,;\, 1\,;\, 4\,)$
Représenter l'état de la liste après chaque appel de primitive en précisant sa tête et sa queue.
# Vos réponses aux questions ici (et/ou insertion d'images)
On peut implémenter simplement une liste avec un tableau (array)
Un tableau est une structure de données représentant une zone contigüe en mémoire de taille fixée.
Chaque élément du tableau est repéré par son indice.
L'accès en mémoire est alors quasi-direct (simple calcul d'adresse à partir de l'adresse de base)
Les listes Python sont en fait des tableaux dynamiques, c'est à dire des tableaux dont la taille est modifiée dynamiquement (pour s'adapter au contenu).
Attention donc à bien distinguer les listes telles que définies ici en tant que structure de données abstraite et les listes Python qui sont un choix d'implémentation spécifique.
Proposer une implémentation des listes avec un tableau de taille fixe:
- en pseudo-code
- en Python avec le paradigme fonctionnel
- en Python avec le paradigme Objet
Identifier les forces et faiblesses de cette implémentation.
Vous pouvez:
- utiliser la 1ère case du tableau pour stocker le nombre d'élément - identifier les cases sans élément avec une valeur nulle (None) - considérer que la tête de liste est le dernier élément du tableau
# Vos réponses aux questions ici (et/ou insertion d'images)
# Votre code ici
Une liste chaînée (linked list) est une structure de données abstraite linéaire:
creeListeChainee()
: crée une liste chaînée videinsereTeteListeChainee(liste, valeur)
: ajoute la valeur spécifiée en tête de la liste chaînéeesupprimeTeteListeChainee(liste)
: supprime la tete de la liste chaînéee et renvoie sa valeurteteListeChainee(liste)
: renvoie la tête de liste chaînéee (type valeur)queueListeChainee(liste)
: renvoie la queue de liste chaînéee (liste chaînée)estListeChaineeVide(liste)
: renvoie True
si la liste chaînéee est vide, False
sinontailleListeChainee(liste)
: renvoie le nombre d'élément de la liste chaînéee ( surcharge de__len__(self)
en objet)elementPosition(liste, i)
: renvoie l'élément en ième position (surcharge de __getitem__(self, i)
en objet)insereValeurPosition(liste, valeur, i)
: insère la valeur spécifiée en ième position (methode insert(self, i)
en objet)Utiliser les primitives pour créer la liste chaînée: $1\rightarrow2\rightarrow3\rightarrow4$
Utiliser les primitives pour modifier la liste chaînée pour obtenir: $2\rightarrow3\rightarrow1\rightarrow4$
Représenter l'état de la liste chaînée après chaque appel de primitive en précisant sa tête.
# Vos réponses aux questions ici (et/ou insertion d'images)
Proposer une implémentation des listes chaînées:
- en pseudo-code
- en Python avec le paradigme fonctionnel
- en Python avec le paradigme Objet
Identifier les forces et faiblesses de cette structure.
NB: Pour l'implémentation objet, implémenter au préalable la classe
Cellule
avec les attributs:
valeur
: la valeur de la cellule
suivant
: adresse de la cellule suivante éventuelle (None
si dernière cellule de la liste chaînée)
Une pile (stack) est une structure de données abstraite linéaire:
creePile()
: crée une pile videempile(pile, valeur)
: ajoute la valeur spécifiée au sommet de la piledepile(pile)
: supprime le sommet de la liste chaînéee et renvoie sa valeursommetPile(pile)
: renvoie le sommet de la pile (type valeur)queuePile(pile)
: renvoie la pile privée de son sommet (pile)estPileVide(pile)
: renvoie True
si la pile est vide, False
sinontaillePile(pile)
: renvoie le nombre d'élément de la pile ( surcharge de__len__(self)
en objet)elementPositionPile(liste, i)
: renvoie l'élément en ième position (surcharge de __getitem__(self, i)
en objet)insereValeurPositionPile(liste, valeur, i)
: insère la valeur spécifiée en ième position (methode insert(self, i)
en objet)Utiliser les primitives pour créer la pile:
4
3
2
1Utiliser les primitives pour modifier la pile pour obtenir:
4
1
3
2Représenter l'état de la pile après chaque appel de primitive en précisant son sommet
# Vos réponses aux questions ici (et/ou insertion d'images)
Proposer une implémentation des piles:
- en pseudo-code
- en Python avec le paradigme fonctionnel
- en Python avec le paradigme Objet
Identifier les forces et faiblesses de cette structure.
NB: Pour l'implémentation objet, implémenter au préalable la classe
Cellule
avec les attributs:
valeur
: la valeur de la cellule
suivant
: adresse de la cellule suivante éventuelle (None
sinon)
Une file (queue) est une structure de données abstraite linéaire:
creeFile()
: crée une file videenfile(file, valeur)
: ajoute la valeur spécifiée en tête de filedefile(file)
: supprime la tête de la file et renvoie sa valeurteteFile(file)
: renvoie la tête de file (type valeur)queueFile(file)
: renvoie la file privée de sa tête (file)estFileeVide(file)
: renvoie True
si la file est vide, False
sinontailleFile(file)
: renvoie le nombre d'élément de la file ( surcharge de__len__(self)
en objet)elementPositionFile(file, i)
: renvoie l'élément en ième position (surcharge de __getitem__(self, i)
en objet)insereValeurPositionFile(file, valeur, i)
: insère la valeur spécifiée en ième position (methode insert(self, i)
en objet)Utiliser les primitives pour créer la file: $1\rightarrow2\rightarrow3\rightarrow4$
Utiliser les primitives pour modifier la file pour obtenir: $2\rightarrow3\rightarrow1\rightarrow4$
Représenter l'état de la liste après chaque appel de primitive
# Vos réponses aux questions ici (et/ou insertion d'images)
Proposer une implémentation des files:
- en pseudo-code
- en Python avec le paradigme fonctionnel
- en Python avec le paradigme Objet
Identifier les forces et faiblesses de cette implémentation.
NB: Pour l'implémentation objet, implémenter au préalable la classe
Cellule
avec les attributs:
valeur
: la valeur de la cellule
suivant
: adresse de la cellule suivante éventuelle (None
sinon)
Proposer une implémentation d'une File avec deux Piles (en paradigme objet)
Proposer une implémentation récursive en paradigme objet des méthodes de calcul de longueur et d'accès aux éléments d'une liste chaînée, d'une pile et d'une file.
NB: à traiter après le cours sur la récursivité
Implémenter une Pile avec deux Files
Implémenter un analyseur syntaxique html