Algorithmique et Analyse d’Algorithmes
Algorithmique et Analyse d’Algorithmes
L3 Info
Cours 5 : Structures de données linéaires
Benjamin Wack
2021 – 2022
Algorithmique et Analyse d’Algorithmes
La dernière fois I Logique de Hoare I Dichotomie Aujourd’hui
I Type Abstrait de Données I Pile, File, File à Priorité
I Algorithmes de bon parenthésage
2 / 37
Algorithmique et Analyse d’Algorithmes
Plan
Notion de Type Abstrait de Données
Structures linéaires Pile
File
File à Priorité
Un TAD, plusieurs implantations
Bon parenthésage Version simple Parenthèses multiples Imbrication, contextes
Algorithmique et Analyse d’Algorithmes Notion de Type Abstrait de Données
Motivation
L’écriture d’un algorithme efficace requiert souvent une façon adéquate : I d’accéder aux données
I de les modifier I de les réorganiser
Le langage fournit des typesatomiques(int, float, char, bool...) pour des donnéessimples.
Pour des donnéescomplexes, c’est le rôle de lastructure de données I définie par l’utilisateur
I ou fournie dans une bibliothèque.
5 / 37
Algorithmique et Analyse d’Algorithmes Notion de Type Abstrait de Données
Type Abstrait de Données : pourquoi, pour qui ?
Ce qui est important c’estl’interfacede la structure de données.
Le TAD est un contrat entre : I chef de projet (décide, spécifie) I développeur (implante)
I utilisateur (utilise)
Il ditquoifaire, comment on va s’enservir, mais pascomment on doit leréaliser.
Remarque
Même les types atomiques ou les tableaux sont déjà une abstraction d’une représentation concrète.
On ne s’amuse pas à manipuler la représentation binaire d’un entier pour
Algorithmique et Analyse d’Algorithmes Notion de Type Abstrait de Données
Avantages de l’approche TAD
En phase de conception :
I permet de se concentrer sur les fonctionnalités attendues I indépendant du langage
En phase de développement :
I on ne code pas en fonction d’un scénario d’utilisation privilégié I démarche de test unitaire
En phase d’utilisation : I travail à haut niveau
I on ne casse pas les propriétés de la structure en la manipulant directement
7 / 37
Algorithmique et Analyse d’Algorithmes Notion de Type Abstrait de Données
Méthodologie
1. Lister lesopérationsautorisées avec leurs profils (parmi lesquelles on peut distinguer des constructeurs) 2. Préciser lespréconditionsde chaque opération
3. Spécifier le comportement des différentes opérations au moyen d’axiomes
Les axiomes :
I ne doivent pas être contradictoires
I doivent permettre de prévoir le résultat de toute opération pour peu que les préconditions soient respectées
Guide d’écriture : toutes les combinaisons valides de la forme opération(constructeur) doivent être traitées.
Algorithmique et Analyse d’Algorithmes Notion de Type Abstrait de Données
À propos des opérations
On prend dans ce cours le point de vue fonctionnel :
I Une opération surt renvoie unnouvel objet(souvent de typet) I Pas d’effets de bord
I Pas de donnée-résultat
En pratique dans la plupart des langages de programmation : I Paramètres modifiables
I Passage par référence (C)
I Caractère modifiable explicite (Ada)
I ⇒évite les problèmes d’empreinte mémoire, la gestion d’un ramasse-miettes...
ET/OU
I Objets et méthodes (Java)
I Sous-entend que la méthode peut modifier l’objet I Évite de passer la structure en paramètre
I Permet d’utiliser la valeur de retour pour autre chose
9 / 37
Algorithmique et Analyse d’Algorithmes Structures linéaires
Notion de structure linéaire
On maintient une collection dans laquelle on peut insérer et extraire des éléments.
l= (a1,a2. . .an) éventuellement vide
I Chaque élément est placé à une « position » dans la structure I Tous les autres éléments sont « avant » ou bien « après » I Pas d’autre hiérarchie entre les éléments
Il reste à choisir :
I où les éléments peuvent être insérés/extraits
I comment leurs positions respectives sont déterminées
Algorithmique et Analyse d’Algorithmes Structures linéaires
Pile
Aperçu
Idée intuitive
Semblable à une pile d’assiettes.
Politique :Dernier arrivé, premier servi(LIFO).
Applications
I Appels de fonctions
I Parcours d’arbre, de graphe avec retour arrière I Parenthésage (cf fin du cours)
a. insérer 4 b. insérer 2 c. extraire
a b c
y y y
2
4 4 4
3 3 3 3
1 1 1 1
5 5 5 5 13 / 37
Algorithmique et Analyse d’Algorithmes Structures linéaires
Pile
Spécification
Opérations PileVide : void→Pile
Empiler : Element×Pile →Pile EstVide : Pile→bool
Sommet : Pile→Element Dépiler : Pile→Pile
Préconditions Sommet(p) : p est non vide Dépiler(p) : p est non vide Axiomes EstVide(PileVide()) = vrai
EstVide(Empiler(e, p)) = faux Sommet(Empiler(e, p)) = e
Dépiler(Empiler(e, p)) = p
Algorithmique et Analyse d’Algorithmes Structures linéaires
File
Aperçu
Idée intuitive
Correspond à la « file d’attente » des supermarchés.
Politique :Premier arrivé, premier servi(FIFO).
Applications
I Accès de plusieurs clients à une ressource (service web, imprimante, processeur)
I Parcours « équilibré » d’arbre, de graphe
Entrée w 3 1 5 w Sortie
insérer 4 x
w 4 3 1 5 w insérer 2 x
w 2 4 3 1 5 w extraire x
w 2 4 3 1 w
16 / 37
Algorithmique et Analyse d’Algorithmes Structures linéaires
File
Spécification
Opérations FileVide : void →File
Enfiler : Element×File→File EstVide : File →bool
Tête : File →Element Défiler : File →File Préconditions Tête(f) : f est non vide
Défiler(f) : f est non vide Axiomes
EstVide(FileVide()) = vrai EstVide(Enfiler(e,f)) = faux Tête(Enfiler(e, FileVide())) = e
Tête(Enfiler(e,f)) = Tête(f) sif non vide Défiler(Enfiler(e, FileVide())) = FileVide()
Algorithmique et Analyse d’Algorithmes Structures linéaires
File à Priorité
Aperçu
Idée intuitive
Chaque élément est muni d’une priorité.
Politique :Le plus prioritaire est le premier servi.
Applications
I Files d’attente avec passe-droit
I Processus dans un système d’exploitation I Plusieurs algorithmes (cf fin du semestre)
19 / 37
Algorithmique et Analyse d’Algorithmes Structures linéaires
File à Priorité
Spécification
Opérations FàPVide : void →FàP
Insérer : Element×int×FàP→FàP EstVide : FàP→bool
Prioritaire : FàP→Element Extraire : FàP→FàP
Préconditions Prioritaire(f) : nonEstVide(f) Extraire(f) : nonEstVide(f)
Algorithmique et Analyse d’Algorithmes Structures linéaires
File à Priorité
Spécification de la FàP (axiomes)
EstVide(FàPVide()) = vrai EstVide(Insérer(e,i,f)) = faux Prioritaire(Insérer(e,i,f)) = e
si EstVide(f)
oui > la priorité de tous les éléments def Prioritaire(Insérer(e,i,f)) = Prioritaire(f)
sif contient un élément de priorité >i Extraire(Insérer(e,i,f)) = f
si EstVide(f)
oui > la priorité de tous les éléments def Extraire(Insérer(e,i,f)) = Insérer(e,i, Extraire(f))
sif contient un élément de priorité >i Remarque : comportement de Extraire et Prioritairenon spécifiésif contient plusieurs éléments de priorité maximale.
Dans ce cas on extraitun deséléments de priorité maximale, mais pas forcément le premier ou le dernier arrivé.
21 / 37
Algorithmique et Analyse d’Algorithmes Un TAD, plusieurs implantations
Méthodologie d’implantation d’un TAD
I Choisir une représentation interne (dans un type déjà connu) I Fournir les opérations de la spécification
I Si possible prouverles axiomes
I (Programmationdéfensive: lever une exception si précondition non respectée)
Principe d’encapsulation
Un TAD bien fait empêche de se servir de l’implantation pour court-circuiter les opérations de la spécification (modules en Ada, OCaml...).
Algorithmique et Analyse d’Algorithmes Un TAD, plusieurs implantations
Exemple : file dans un tableau (naïve)
Représentation
2 4 3 1 5
I on mémorise également le nombrenbd’éléments dans la file I T[nb] est en tête de file, etT[1] en queue
Opérations I FileVide
nb := 0 I Défiler(f)
nb := nb - 1 I Enfiler(e,f)
2 4 3 1 5
x x x x x
e 2 4 3 1 5
nb := nb + 1
24 / 37
Algorithmique et Analyse d’Algorithmes Un TAD, plusieurs implantations
File dans un tableau (efficace)
Représentation
2 4 3 1 5
↑ ↑
queue tete
I on mémorisedeuxindicesteteetqueue Opérations
I FileVide
tete := 1 ; queue := 1 I Défiler(f)
tete := tete - 1 I Enfiler(f,e)
T[queue] := e queue := queue - 1
En cas de dépassement des bornes : tableau « circulaire »
3 1 5 2 4
Algorithmique et Analyse d’Algorithmes Un TAD, plusieurs implantations
File dans une liste chaînée
Représentation
1 3 4
2 5
queue
tete
I on maintient aussi un pointeur sur le dernier élément de la liste.
I Attention, ce dernier élément est laqueue de la file.
Opérations I FileVide
tete queue
I Défiler(f)
1 3 4
2 5
queue
tete
I Enfiler(f,e)
e 2 4 3 1 5 tete
queue
26 / 37
Algorithmique et Analyse d’Algorithmes Un TAD, plusieurs implantations
Que choisir ?
Tableau
Avantages : allocation unique, accès rapide, empreinte mémoire faible Inconvénients : file bornée, ou espace mémoire jamais utilisé
Liste chaînée
Avantages : optimisation de la mémoire, pas de borne sur la taille Inconvénients : gestion de mémoire plus lourde (avec les risques de fuite
inhérents)
Cela peut enfin dépendre des opérations supplémentaires voulues (concaténation de files...)
Algorithmique et Analyse d’Algorithmes Bon parenthésage
Version simple
Le problème
Étant donné un « texte » (flot de caractères) comportant des parenthèses ouvrantes et fermantes, vérifier si chaque parenthèse possède une
« correspondante ».
Exemples ( ( ) ( ) )
( ( ) ) ( ) sont bien parenthésés.
( ( ) ( ) ( ( ) ) ) ) (
ne le sont pas.
Enfin le texte peut comporter des caractères « neutres » : aaa(bbb(cc)dd)e.
29 / 37
Algorithmique et Analyse d’Algorithmes Bon parenthésage
Version simple
Algorithme
PARENTHESAGE_SIMPLE p:= PileVide()
whileil reste des caractères c:= caractère suivant ifc = ’(’
Empiler(p,c) ifc = ’)’
ifEstVide(p)
returnErreur de parenthésage else
Dépiler(p) ifEstVide(p)
returnParenthésage correct else
Algorithmique et Analyse d’Algorithmes Bon parenthésage
Parenthèses multiples
Une première variante
Remarque
La pile ne sert ici qu’à compter les parenthèses ouvertes... il suffirait d’un entier !
Cas plus général : différentes paires de parenthèses
I Langages de programmation () {} begin end
I Langages de balises <html></html> <div></div> <b></b>
I ...
Exemple
( { ) }est correct si on ne tient compte que d’un type de parenthèses, mais pas pour les deux à la fois.
32 / 37
Algorithmique et Analyse d’Algorithmes Bon parenthésage
Parenthèses multiples
Adaptation de l’algorithme
PARENTHESAGE_MULTIPLE p:= PileVide()
whileil reste des caractères c:= caractère suivant
ifc est une parenthèse ouvrante Empiler(p,c)
ifc est une parenthèse fermante
ifEstVide(p) ou Sommet(p) ne correspond pas à c returnErreur de parenthésage
else
Dépiler(p) ifEstVide(p)
returnParenthésage correct else
returnErreur de parenthésage
Algorithmique et Analyse d’Algorithmes Bon parenthésage
Imbrication, contextes
Notion de contexte
Leniveau d’imbricationen un point du texte est le nombre de parenthèses ouvertes (et non encore fermées).
On appellecontexteune partie du texte comprise entre deux parenthèses correspondantes et de même niveau d’imbrication.
Exemple
Dansaaa[bb(ccc{ddd}ccc[eee]ccc)bb]a:
I Le niveau d’imbrication maximal est 3 (pour les lettresdete).
I Chaque caractère correspond à un contexte différent.
35 / 37
Algorithmique et Analyse d’Algorithmes Bon parenthésage
Imbrication, contextes
Quelques problèmes
On peut alors poser plusieurs problèmes : Calculer le niveau d’imbrication maximal
Il suffit de mémoriser et d’actualiser la hauteur courante de la pile, ainsi que sa hauteur maximale.
Apparier les parenthèses correspondantes en donnant leurs positions dans le texte
Il suffit d’empiler avec chaque parenthèse sa position dans le texte.
Calculer les longueurs des contextes
On maintient à jour la longueur du contexte courant.
Lorsqu’on ouvre une nouvelle parenthèse, on empile également la longueur du contexte « supérieur » et on repart à 0.
Lorsqu’on ferme une parenthèse, on dépile la longueur déjà lue du
Algorithmique et Analyse d’Algorithmes Bon parenthésage
Imbrication, contextes
En résumé
Aujourd’hui
I Un Type Abstrait de Donnéesdécrit les opérations autorisées, pas le détail de la représentation
I Envariant les opérationspermises on obtient différentesstructures linéaires: Pile, File, File à Priorité...
I Algorithme de bon parenthésage :efficacegrâce à l’utilisation d’une structure de données appropriée
La prochaine fois I Type abstrait Arbre I Structures arborescentes I Partition Binaire de l’Espace
37 / 37