TP : Utilisation des piles (2)

publicité
Lycée Victor Hugo
MP-MP*-PC-PC*-PSI 2016-2017
TP : Utilisation des piles (2)
Ouvrir le fichier TPPiles.py et valider la partie nommée "Primitives". Vous venez ainsi de
définir sous Python une nouvelle classe autonome d’objets : la classe Pile.
Rappelons le plus important : les six fonctionnalités de cette classe seront les seuls outils
de base que l’on s’autorisera sur ce TP ; ce sont les seules que l’on s’autorise a priori sur les
piles (peu importe leur implémentation réelle sous forme d’une classe ou d’une liste). Voici le
fonctionnement de ces méthodes :
1. Création d’une pile vide nommée MaPile :
MaPile = Pile ()
2. Test de la vacuité d’une pile
Mapile . estvide () # pour savoir si la pile est vide
3. Empiler une donnée sur MaPile :
Mapile . empiler ( donn é e )
4. Dépiler : (Attention : s’assurer que la pile est non vide !)
element = MaPile . depiler () # on d é pile la pile et on stocke le
r é sultat dans element
5. Consultation de l’élément en haut de la pile : (Attention : s’assurer que la pile est non vide !)
element = MaPile . sommet () # on consulte le sommet de la pile
sans la d é piler et on stocke le r é sultat dans element
6. Afficher la pile :
MaPile . affiche ()
1
Lycée Victor Hugo
I
MP-MP*-PC-PC*-PSI 2016-2017
Calculatrice en Notation Polonaise Inversée
On souhaite écrire un simulateur de calculatrice utilisant la notation polonaise inversée selon
le principe décrit en cours. Le programme demandera la saisie par la fonction input des opérateurs et des opérandes. À chaque saisie le programme affichera l’état de la pile : après la saisie
d’un nombre on affiche la pile avec simplement ce nouveau nombre au sommet, après la saisie
d’un opérateur on affiche l’état de la pile après application de l’opération sur les opérandes.
On se limitera aux quatres opérations +,-,*,/. On précise que a b - calcule a-b et que
a b / calcule a/b.
On tapera & pour indiquer la fin du calcul au simulateur qui affichera alors le sommet de la
pile.
Petit Rappel : la fonction input renvoie une chaîne de caractères.
Script 1 H
Coder la fonction calculatriceNPI() que l’on doit appeler pour lancer le simulateur.
2
Lycée Victor Hugo
II
MP-MP*-PC-PC*-PSI 2016-2017
Majorité absolue
Nous allons nous intéresser à deux algorithmes dit
de "majorité absolue", i.e. qui détermine si dans une liste
L donnée, il existe un élément qui apparaît avec une fréquence strictement supérieure à 50%.
Ces algorithmes peuvent se révéler particulièrement
utiles lors du premier tour d’un scrutin majoritaire à deux
tours (comme par exemple l’élection présidentielle).
1
Premier algorithme
A
Description
On crée une pile p.
Dans un premier temps, on lit la liste L en modifiant p selon les règles suivantes :
• Si p est vide ou si l’élément lu est déjà en haut de la pile p, on empile l’élément lu sur la
pile p.
• Sinon, on dépile un élément de p .
Si à la fin de cette étape, la pile p est non vide, l’élément potentiellement majoritaire est
l’élément x en haut de la pile p.
Pour le vérifier concrètement, il reste alors à re-parcourir la liste en comptant le nombre
d’occurrences de x au sein de la liste L.
B
Commentaires
Nous admettrons (exercice !) que cet algorithme est correct, c’est à dire qu’il permet effectivement de savoir s’il y a ou non un élément majoritaire et de le détecter le cas échéant.
Question 2 H
Lorsque la liste contient bien un élément majoritaire, quelle est la complexité temporelle de
l’algorithme ?
Question 3 H
À l’aide d’une feuille et d’un crayon ( !), appliquer l’algorithme sur les listes [A, A, C, B, B]
puis [A, A, B, C, B, B, B, C, A, B, B] .
C
À vous de jouer !
Script 4 H
Écrire une fonction nommée majoritaire qui se base sur l’algorithme ci-dessus.
Elle prendra comme argument une liste et renverra un couple de type (bool,elem) où :
- bool vaut True lorsque la liste a un élement majoritaire et False dans le cas contraire.
- elem vaut l’élément majoritaire lorsqu’il existe bien (et le premier élément de la liste sinon).
Ne pas oublier de tester votre fonction.
3
Lycée Victor Hugo
MP-MP*-PC-PC*-PSI 2016-2017
2
Second algorithme ou algorithme optimal
A
Description
On crée deux piles p et p0 .
Dans un premier temps, on lit la liste en modifiant les piles selon les règles suivantes :
• Si l’élément lu est déjà en haut de la pile p0 , on le place dans la pile p.
• Sinon, on le place dans la pile p0 et on dépile (lorsque c’est possible) un élément de p que
l’on place dans p0 .
A la fin de cette première étape, l’élément potentiellement majoritaire est l’élément x en
haut de la pile p0 .
Dans un second temps, on parcourt la pile p0 en comparant l’élément en haut avec x :
• Si l’élément en haut est égal à x, on dépile :
deux éléments de p0 si elle contient au moins deux éléments.
le seul élément de p0 sinon que l’on place dans p.
• Sinon :
ou bien p est vide et l’algorithme s’arrête : il n’y a pas d’élément majoritaire.
ou bien p est non vide et on dépile un élément de p et de p0 .
Enfin, pour conclure cet algorithme dans le cas où la seconde étape a bien été menée jusqu’à
son terme, on considère la pile p :
• Si p a été entièrement vidée, il n’y a pas d’élément majoritaire dans la liste.
• Sinon, x est l’élément majoritaire.
B
Exemples
Illustrons l’algorithme optimal par l’exemple de la Liste [A, A, B, C, B, B, B, C, A, B, B] .
Tout d’abord l’évolution des deux piles lors de la première étape :
p0
A
p
Liste
A
A
B
A
B
C
A
B
A
C
A
B
A
A
A
A
B
C
B
B
C
A
B
A
B
C
A
B
A
B
C
B
C
A
B
A
B
B
B
B
B
B
C
B
A
B
C
B
C
A
B
A
A
B
A
B
C
B
C
A
B
A
B
A
B
C
B
C
A
B
A
B
B
B
B
B
,→ À ce stade, B est potentiellement majoritaire.
4
Lycée Victor Hugo
MP-MP*-PC-PC*-PSI 2016-2017
Ensuite la seconde étape :
p0
B
A
B
C
B
C
A
B
A
B
C
B
C
A
B
A
B
C
A
B
A
A
B
A
B
A
p
B
B
B
B
B
B
B
B
B
B
À la fin, p n’est pas vide. On en déduit que B est bel et bien majoritaire au sein de la Liste.
C
Commentaires
Nous admettrons également la correction de l’algorithme. (démo plus difficile !)
Quelle est sa complexité
? Pour une liste de longueur n donnée, on peut montrer
temporelle
3n
− 2 comparaisons et qu’il impossible de mettre au point un autre
que l’algorithme requiert
2
procédé en utilisant moins.
C’est pourquoi on peut qualifier l’algorithme décrit ci-dessus d’optimal.
D
A vous de jouer !
Question 5 H
À l’aide d’une feuille et d’un crayon ( !), appliquer les deux étapes de l’algorithme sur les listes
[A, A, B, A, C, B, A] puis [A, B, A, C, B, A].
Script 6 H
Écrire une fonction nommée optimal basée sur ce second algorithme.
5
Téléchargement