• Aucun résultat trouvé

Algorithmique et Analyse d’Algorithmes

N/A
N/A
Protected

Academic year: 2022

Partager "Algorithmique et Analyse d’Algorithmes"

Copied!
28
0
0

Texte intégral

(1)

Algorithmique et Analyse d’Algorithmes

Algorithmique et Analyse d’Algorithmes

L3 Info

Cours 5 : Structures de données linéaires

Benjamin Wack

2021 – 2022

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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.

(8)

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

(9)

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

(10)

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

(11)

Algorithmique et Analyse d’Algorithmes Structures linéaires

Pile

Spécification

Opérations PileVide : voidPile

Empiler : Element×PilePile EstVide : Pilebool

Sommet : PileElement Dépiler : PilePile

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

(12)

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

(13)

Algorithmique et Analyse d’Algorithmes Structures linéaires

File

Spécification

Opérations FileVide : voidFile

Enfiler : Element×FileFile EstVide : Filebool

Tête : FileElement Défiler : FileFile 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()

(14)

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

(15)

Algorithmique et Analyse d’Algorithmes Structures linéaires

File à Priorité

Spécification

Opérations FàPVide : voidFàP

Insérer : Element×int×FàPFàP EstVide : FàP→bool

Prioritaire : FàP→Element Extraire : FàP→FàP

Préconditions Prioritaire(f) : nonEstVide(f) Extraire(f) : nonEstVide(f)

(16)

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

(17)

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...).

(18)

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

(19)

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

(20)

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

(21)

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...)

(22)

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

(23)

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

(24)

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

(25)

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

(26)

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

(27)

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

(28)

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

Références

Documents relatifs

Le calcul du coût d’un algorithme s’obtient donc en composant les coûts des différentes opérations composant l’algorithme. I assemblage et reconstruction I méthode

I Comment évaluer l’efficacité d’un algorithme plus finement que dans le pire cas.. I

En résumé Aujourd’hui I Un algorithme est démontré correct par rapport à une spécification I Un invariant est une propriété préservée par une boucle, utile pour démontrer

I La logique de Hoare permet de démontrer qu’un programme vérifie une spécification. I On part des postconditions et on cherche les préconditions adaptées I Programmation par contrat

Exercice 10: Appliquez l’algorithme de recherche d’une cl´ e dans un arbre binaire de recherche sur l’arbre pr´ ec´ edent. On prendra k

Ensuite, d´ eterminer pour chacune d’elle la taille de la pile g´ en´ er´

• Meilleur cas: notée par t min (n) repésentant la complexité de l’algorithme dans le meilleur des cas en fonction du paramètre n (ici le nombre d’éléments dans le

spécifiques dans la structure de données, la méthode du potentiel de l’analyse amortie représente ce travail comme un potentiel qui peut être libéré pour payer des.