SDA
Tris
c
EPFL 2002–2012
J. Sam
Introduction à la Programmation Objet :
Structures de données abstraites
Algorithmes de tri
Laboratoire d’Intelligence Artificielle
Faculté I&C
IPO – Cours 12 :– Récursivité | Complexité– 1 / 54
SDA
Tris
c
EPFL 2002–2012
J. Sam
Objectifs du cours d’aujourd’hui
Continuer l’approfondissement de la programmation de base en
présentant d’autres thèmes de l’informatique :
introduction aux structures de données abstraites (sda) :
listes chaînées
piles
introduction aux algorithmes de tris
IPO – Cours 12 :– Récursivité | Complexité– 2 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Pourquoi modéliser les données?
L’élaboration d’un algorithme est grandement facilité par
l’utilisation de structures de données abstraites, de plus haut
niveau, et de fonctions de manipulations associées.
Une structure de données doit modéliser au mieux les
informations à traiter pour en faciliter le traitement par l’algorithme
considéré.
Choisir les bons modèles de données est aussi important que le
choix de bons algorithmes
Algorithme et structure de données abstraite sont intimement liés :
Programme = algorithme + données
IPO – Cours 12 :– Récursivité | Complexité– 3 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Une “structure de données abstraite”?!?
Une structure de données abstraite (S.D.A.) est un ensemble
organisé d’informations (ou données) reliées logiquement et
pouvant être manipulées non seulement individuellement mais
aussi comme un tout.
Exemples généraux :
tableau (au sens général du terme)
contenu : divers éléments de types à préciser
interactions : demander la taille du tableau, accéder
(lecture/écriture) à chaque élément
individuellement, ...
Exemple informatique élémentaire :
Vous connaissez déjà des structures de données abstraites, très
simples : les types élémentaires.
Par exemple, un int
interactions : affectation, lecture de la valeur, +,-,*,/
IPO – Cours 12 :– Récursivité | Complexité– 4 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Spécifications des
structures de données abstraites
Une S.D.A. est caractérisée par :
son contenu
les interactions possibles (manipulation, accès, ...)
Du point de vue informatique, une structure de données abstraite
peut être spécifiée à deux niveaux :
niveau fonctionnel / logique : spécification formelle des
données et des algorithmes de manipulation associés
niveau physique (conception) : comment est implémentée la
structure de données abstraite dans la mémoire de la
machine
déterminant pour l’efficacité des programmes utilisant ces
données.
IPO – Cours 12 :– Récursivité | Complexité– 5 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Spécifications des S.D.A. [2]
Une structure de données abstraite définit une abstraction des
données et cache les détails de leur implémentation.
Par exemple, vous ne pensez pas un int comme une suite de
32 bits, mais bien comme un “entier” (dans un certain intervalle)
avec ses opérations propres : +,-,*,/
abstraction : identifier précisément les caractéristiques de l’entité
(par rapport à ses applications), et en décrire les propriétés.
IPO – Cours 12 :– Récursivité | Complexité– 6 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Spécifications des S.D.A. [3]
Une structure de données abstraite modélise donc l’ensemble
des services désirés plutôt que l’organisation intime des données
(détails d’implémentation)
On identifie usuellement quatre types de “services” :
1. les modificateurs, qui modifient la S.D.A.
2. les sélecteurs, qui permettent “d’interroger” la S.D.A.
3. les itérateurs, qui permettent de parcourir la structure
4. les constructeurs
Exemple :
tableau
modifieur : affectation d’un élément (t[i]=a)
sélecteur : lecture d’un élément (t[i])
sélecteur : le tableau est-il vide? (t.length == 0)
itérateur : index d’un élément ([i] ci-dessus)
constructeur :(new)
IPO – Cours 12 :– Récursivité | Complexité– 7 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Divers exemples de S.D.A.
Il existe de nombreuses structures de données abstraites en
informatique.
Dans ce cours, nous n’allons voir que deux parmi les plus
fondamentales :
les listes
et les piles
Autres :
files d’attente (avec ou sans priorité)
multi-listes
arbres (plein de sorte...)
graphes
tables de hachage
IPO – Cours 12 :– Récursivité | Complexité– 8 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Listes
Spécification logique :
Ensemble d’éléments successifs (pas d’accès direct), ordonnés
ou non
Interactions :
Accès au premier élément (sélecteur)
Accès à l’élément suivant d’un élément (sélecteur)
Modifier l’élément courant (modificateur)
Insérer/supprimer un élément après(/avant) l’élément courant
(modificateur)
Tester si la liste est vide (sélecteur)
Parcourir la liste (itérateur)
IPO – Cours 12 :– Récursivité | Complexité– 9 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Listes
Exemple concret :
visionneuse stéréo (essayez d’accéder
à la 3e image directement, sans passer par
la 2e!)
Exemple informatique : ( a ( b ( c (d))))
ab c d 0
Une liste peut être vue comme une structure récursive :
liste = élément + liste OU liste = vide
IPO – Cours 12 :– Récursivité | Complexité– 10 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Réalisations d’une liste
Réalisation statique :
tableau
Réalisation dynamique (liste chaînée) :
class Liste {
Noeud tete; // le debut de la liste
Noeud courant; // l’element sur lequel
//on est positionn’e
...
void inserer(Type donnee) {
...
}
}
class Noeud {
Type donnee;
Noeud suivant;
Noeud(Type donnee) {
this.donnee = donnee;
suivant = null;}
}
IPO – Cours 12 :– Récursivité | Complexité– 11 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Pourquoi des listes dynamiques?
Les tableaux sont un type de donnée très utile en programmation
mais présentent deux limitations :
1. Les données sont contigües (les unes derrière les autres)
et donc l’insertion d’un nouvel élément au milieu du tableau
demande la recopie (le décalage) de tous les éléments
suivants.
=insertion en O(n)
2. Pour les tableaux statiques, augmenter la taille (par exemple
si elle n’est pas connue a priori) nécessite la création d’un
nouveau tableau
=O(n)
IPO – Cours 12 :– Récursivité | Complexité– 12 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Complexité des opérations élémentaires sur
les listes
Insérer un élément : O(1)
Supprimer un élément : O(1)
Calculer la longueur : O(n)
(voire O(1)si le stockage de cette valeur est effectué,
par exemple en particulier si “longueur” a été spécifiée
dans les “services” de la SDA “liste”)
Vider la liste : O(n)
Parcourir la liste : O(n)
IPO – Cours 12 :– Récursivité | Complexité– 13 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Exemples d’insertion d’un élément
Après un élément donné (l’élément courant ici) :
void insere(Type donnee)
{Noeud e = new Noeud(donnee);
e.suivant = (this.courant).suivant;
courant.suivant = e;
}
tête courant
nouveau noeud
2 1
donnée
IPO – Cours 12 :– Récursivité | Complexité– 14 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Exemple de calcul de la longueur
int taille(Liste liste)
{int taille=0;
Noeud n=tete;
while (!n.suivant == null) {
taille++;
n = n.suivant;
}
return taille;
}
IPO – Cours 12 :– Récursivité | Complexité– 15 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Piles
Spécification :
Une pile est une structure de données abstraite dynamique
contenant des éléments homogènes (de type non précisé) à 1
point d’accès et permettant
d’ajouter une valeur à la pile (empiler ou push);
de lire la dernière valeur ajoutée;
d’enlever la dernière valeur ajoutée (dépiler ou pop);
de tester si la pile est vide.
On ne “connait” donc de la pile que son dernier élément.
Exemple d’implémentation physique : tableau
IPO – Cours 12 :– Récursivité | Complexité– 16 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Piles : exemples
Exemples concrets :
une pile d’assiettes
poupées russes
une tour dans le jeu des tours de Hanoi
IPO – Cours 12 :– Récursivité | Complexité– 17 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Piles : exemples (2)
Exemple d’utilisation (formelle) :
empiler x x
empiler a a
x
dépiler x
empiler b b
x
empiler y y
b
x
dépiler b
x
IPO – Cours 12 :– Récursivité | Complexité– 18 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Exemple d’utilisation des piles
Le problème des parenthèses : étant donnée une expression avec
des parenthèses, est-elle bien ou mal parenthésée?
((a+b)c(d+4)(5+ (a+c))) (c+ (d+ (e+5g)f)a)
(correct)(a+b)(
(incorrect)
Encore un peu plus complexe : différentes parenthèses
Exemple avec [et (
([])[()(()[])] correct
([)] incorrect
Autres exemples d’utilisation des piles (non traités ici) :
tours de Hanoi
notation postfixée (ou “polonaise inverse”) :
4 2 +5
(5(4+2))
IPO – Cours 12 :– Récursivité | Complexité– 19 / 54
SDA
Listes
Piles
Tris
c
EPFL 2002–2012
J. Sam
Vérification de parenthésage
Tant que lire caractère c
Si cest (ou [
empiler c
Sinon
Si cest )ou ]
clire la pile
Si cet ccorres-
pondent
dépiler
Sinon
ÉCHEC
Si pile vide
OK
Sinon
ÉCHEC
Exemple
Entrée : ([)]
empile ((
empile [[
(
lu = ), top = [
ne correspond pas
=ERREUR
IPO – Cours 12 :– Récursivité | Complexité– 20 / 54
1 / 14 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!