De nombreux algorithmes "classiques" manipulent des structures de données plus complexes que des simples nombres (nous aurons l'occasion d'en voir plusieurs cette année). Nous allons ici voir quelques-unes de ces structures de données. Nous allons commencer par des types de structures relativement simples : les listes, les piles et les files. Ces trois types de structures sont qualifiés de linéaires.
Une liste est une structure de données permettant de regrouper des données et dont l'accès est séquentiel.
Le langage de programmation Lisp (inventé par John McCarthy en 1958) a été un des premiers langages de programmation à introduire cette notion de liste (Lisp signifie "list processing").
Voici les opérations qui peuvent être effectuées sur une liste :
CREER_LISTE_VIDE() crée et retourne une liste vide.
INSERER(L,e,i) : insére l'élément e à la position i de la liste L.
SUPPRIMER(L,i) : supprime l'élément à la position i de la liste L.
RECHERCHER(L,e) : recherche l'élément e de la liste L et on retourne son index.
LIRE(L,i) : retourne l'élément de la liste L en position i.
MODIFIER(L,i,e) : L'élément à la position i de la liste L est remplacée par l'élement e.
LONGUEUR(L) : retourne le nombre d'éléments de la liste L.
Voici une série d'instructions (les instructions ci-dessous s'enchaînent):
L= CREER_LISTE_VIDE()
INSERER(L,'A',1)
INSERER(L,'O',2)
INSERER(L,'B',1)
INSERER(L,'V',3)
INSERER(L,'R',2)
L à la fin ?
A la fin : L = ('B','R','A','V','O')
Une manière simple de représenter une liste est d'utiliser un tableau de taille fixe dont chaque élément est identifié par son indice.
Tous les langages de programmation permettent d'implémenter des tableaux. En Python, le type de données le plus simple pour représenter un tableau est le type list.
On peut représenter une liste contenant n éléments avec un tableau L[0..n] comme suit :
Parmi les listes, 2 structures particulières sont optimisées pour leur accès en mémoire.
Ce sont les piles et les files.
INSERER et SUPPRIMER
Fonction INSERER(L,x,i)
Si (L[0] = n + 1 ou i - 1 > L[0])
Retourner Faux
Pour k allant de L[0] + 1 à (i + 1) par pas de -1
L[k] = L[k-1]
L[i] = x
L[0] = L[0] + 1
Retourner Vrai
SUPPRIMER(L,i)On retrouve dans les piles une partie des propriétés vues sur les listes. Dans les piles, il est uniquement possible de manipuler le dernier élément introduit dans la pile. On prend souvent l'analogie avec une pile d'assiettes : dans une pile d'assiettes la seule assiette directement accessible et la dernière assiette qui a été déposée sur la pile.
Les piles sont basées sur le principe LIFO (Last In First Out : le dernier rentré sera le premier à sortir). On retrouve souvent ce principe LIFO en informatique.
Voici les opérations que l'on peut réaliser sur une pile :
CREER_PILE_VIDE() crée et retourne une pile vide.
EMPILER(P,e) : insére l'élément e au sommet de la pile P.
DEPILER(P) : enlève et retourne l'élément au sommet de la pile P.
EST_VIDE(P) : retourne Vrai si la pile P est vide et Faux sinon.
EST_PLEINE(P) : retourne Vrai si la pile P est pleine et Faux sinon.
Voici une série d'instructions (les instructions ci-dessous s'enchaînent):
P= CREER_PILE_VIDE()
EMPILER(P,3)
EMPILER(P,2)
N = DEPILER(P)
EMPILER(P,5)
EMPILER(P,7)
EMPILER(P,9)
A la fin : P = (3, 5, 7, 9) et N = 2
On peut représenter une pile contenant n éléments avec un tableau P[0..n] comme suit :
EMPILER(P,x)DEPILER(P)Comme les piles, les files ont des points communs avec les listes. Différences majeures : dans une file on ajoute des éléments à une extrémité de la file et on supprime des éléments à l'autre extrémité. On prend souvent l'analogie de la file d'attente devant un magasin pour décrire une file de données.
Les files sont basées sur le principe FIFO (First In First Out : le premier qui est rentré sera le premier à sortir. Ici aussi, on retrouve souvent ce principe FIFO en informatique.
Voici les opérations que l'on peut réaliser sur une file :
CREER_FILE_VIDE() crée et retourne une file vide.
ENFILER(F,e) : insére l'élément e à la queue de la file F.
DEFILER(F) : enlève et retourne l'élément situé en tête de la file F.
EST_VIDE(F) : retourne Vrai si la file F est vide et Faux sinon.
EST_PLEINE(F) : retourne Vrai si la file F est pleine et Faux sinon.
Voici une série d'instructions (les instructions ci-dessous s'enchaînent):
F= CREER_FILE_VIDE()
ENFILER(F,14)
ENFILER(F,11)
ENFILER(F,64)
N = DEFILER(F)
ENFILER(F,27)
ENFILER(F,9)
N = DEFILER(F)
Donner les valeurs de F et de N à la fin.
A la fin : F = (64, 27, 9) et N = 11
On peut représenter une file contenant n éléments avec un tableau F[0..n+2] comme suit :
Remarques :
ENFILER(F)DEFILER(F)Un dictionnaire est une structure de données qui associe une valeur à une clé.
On peut représenter les informations sur une personne (Prénom, Nom, date de naissance) par un dictionnaire à l'aide de paires (clé,valeur) :
Les dictionnaires ne sont pas une structure ordonnée. Contrairement aux listes, on ne peut pas retrouver un élément via sa position. On y accède via sa clé.
Voici les opérations que l'on peut réaliser sur un dictionnaire :
CREER_DICTIONNAIRE_VIDE() crée et retourne un dictionnaire vide.
INSERER(D,cle,valeur) : insére l'entrée cle-valeur dans le dictionnaire D.
SUPPRIMER(D,cle) : supprime l'entrée dont la clé est cle du dictionnaire D.
LIRE(D,cle) : retourne la valeur correspondant à la cle cle du dictionnaire D.
RECHERCHER(D,cle) : retourne Vrai si le dictionnaire D contient la clé cle et Faux sinon.
un_illustre_informaticien = {"prenom":"Alan","nom":"Turing","date_naissance":"23-05-1912"}