Académique Documents
Professionnel Documents
Culture Documents
Cours-pc4
1
• Dans chaque état, selon la nature de la prochaine lettre lue dans la
séquence A, C , G ou T (vue comme un ticket), il y a un changement
d’état.
• L’état suivant est uniquement déterminé par les trois informations (état
courant, ticket lu, motif)
Ces états peuvent être notés, pour le motif m(1)m(2) . . . m(k) par
• Em(1)m(2) ou second état (les deux premières lettres du motif ont été
lues dans l’ordre, ... et on ne fait pas plus)
• ...
Les états de l’automate sont liés entre eux par des arcs étiquetés par les
tickets lus. Un arc est donc modélisé par un triplet (état courant, ticket, état
suivant). Pour tous les états (hors l’état gagnant) e et pour tous les tickets
t, il existe un arc (e, t, e′ ) dans l’automate indiquant le changement d’état.
L’algorithme permettant de construire l’automate à partir d’un motif est
alors le suivant:
2
Pour représenter les automates, nous utiliserons des listes à double entrée ou
des dictionnaires python.
À titre d’exemple, donnons ci-dessous l’automate correspondant au motif
AAT AAC :
(le cas X est un cas exceptionnel : peu importe l’état suivant de l’état gag-
nant: il y a arrêt de la recherche dans l’état gagnant. Il y a en fait deux
options classiques, soit rester dans l’état final (et alors X vaut ici EAAT AAC )
ou bien réamorcer la lecture du motif.)
3
Exercice sur la structure de données Pile
Les piles définissent une structure de données de stockage qui suit une poli-
tique LIFO (Last In, First Out) d’ajout et de retrait d’élément. Un moyen
simple d’implanter la structure de données des piles est d’utiliser les listes
python
1. En supposant que les piles ont été implantées au moyen des listes
python, écrire les fonctions usuelles d’ajout (empiler(e,P)) et de retrait
(depiler(P)) ainsi que la fonction sommet(P) qui rend le sommet de la
pile et la fonction estVide(P) qui teste si la pile est vide.
2. Evaluation des expressions arithmétiques postfixées.
On suppose manipuler des expressions arithmétiques sans variable définies
à partir des 4 opérations arithmétiques +, −, ×, ÷ et des entiers. La
notation postfixée consiste à mettre les opérations arithmétiques après
leurs 2 arguments. Ainsi, une expression arithmétique de la forme n•m
ou • ∈ {+, −, ×, ÷} a pour notation postfixée l’expression n m •. On
suppose que les expressions arithmétiques postfixées sont stockées dans
une liste de chaı̂nes de caractères où chacune des chaı̂nes de caractères
représente soit un entier soit une opération arithmétique. En utilisant
une pile, écrire une fonction qui à partir d’une expression arithmétique
en notation postfixée, évalue cette expression et retourne le résultat.
4
1. En supposant que les files ont été implantées au moyen des listes
python, écrire les fonctions usuelles d’ajout et de retrait ainsi que les
deux fonctions qui respectivement rendent le premier élément de la file
et testent si la file est vide.
5
• On ajoute la fonction nbUrgences qui compte le nombre de patients
prioritaires dans une file de rendez-vous d’un médecin.
• On ajoute une nouvelle opération inserePatient qui insère un nou-
veau patient dans les files de rendez-vous selon les critères suivants
:
– L’ordre relatif des patients dans la file de rendez-vous de
chaque médecin doit vérifier les mêmes conditions que précedemment.
– Si un patient prioritaire arrive, il doit être placé dans la file
de rendez-vous du médecin qui a le moins de cas prioritaires
en attente.
– Si un patient non prioritaire arrive, il doit être placé dans la
file de rendez-vous du medecin qui a le moins de patients en
attente.
Immatriculation
Considérons une application de préfecture consistant à maintenir une base
de données des véhicules immatriculés et de leur propriétaire. Les plaques
d’immatriculation sont de la forme (n1 , c1 c2 c3 , n2 ) avec :
• n1 un chiffre compris entre 0001 et 9999
• 1846 RC 69
• 8626 BD 69
• 2536 ARC 30
• 1789 KTZ 90
6
Quel problème cela pose ?
Approche naı̈ve
L’approche naı̂ne consiste à tester les O(N 2 ) paires.
7
Approche efficace : avec une table de hachage
Pour trouver les sites voisins, une approche efficace consiste à découper la
zone suivant une grille dont chaque cellule est de dimension R×R. Deux sites
voisins sont alors soit dans la même cellule soit dans deux cellules adjacentes.
On va alors créer une table qui associe à chaque cellule la liste des sites
qu’elle contient. L’algorithme va alors consister à tester pour chaque site s
la distance avec tous les sites contenus dans la même cellule que s ainsi que
dans chacune des huit cellules adjacentes. La complexité de cet algorithme
est aussi de O(N 2 ) dans le pire des cas, i.e. tous les sites localisés dans
la même cellule. On peut raisonnablement supposer qu’ils sont distribués
de telle manière que le nombre de points par cellule est borné par une con-
stante. Dans ce cas, la complexité de l’algorithme est de O(N ), ce qui est une
amélioration considérable. Certaines tailles d’instances peuvent être traités
dans l’ordre d’une seconde, là où l’algorithme en O(N 2 ) mettrait plus d’une
semaine.
2. Une cellule pouvant contenir plusieurs sites, les valeurs de notre table
d’associations seront donc des listes de sites. Pour commencer il nous
faut une structure de données qui associe à chaque cellule la liste des
sites qu’elle contient. Ecrire une méthode cellules(liste,R) qui place les
sites dans les cellules selon la fonction de hachage et qui retourne ces
informations dans une structure adaptée.
8
3. Ecrire une fonction qui permet de trouver tous les voisins d’un site s
donné avec l’approche efficace puis une fonction qui calcule l’ensemble
du voisinage des sites entre eux. Le principe est pour chaque site s
de chercher dans les neufs cellules environnantes (celle de s inclus) des
voisins. (Astuce : pour cela créez des sites temporaires aux coordonnées
(s.x − R, s.y − R), (s.x, s.y − R), (s.x, s.y + R), (s.x − R, s.y), etc. et
parcourez la liste associée à leurs cellules)
• Une station est identifiée par son nom. Elle contient un certain nombre
d’emplacements; chaque emplacement peut être vide ou contenir un
vélo.
• Un déplacement est décrit par un vélo, une heure de départ, une station
de départ, une station d’arrivée, et une heure d’arrivée qui sera par
défaut l’heure de départ plus 30 minutes.
Pour simuler l’activité des vélos, deux listes sont utilisées. La première con-
tient les stations. La deuxième contient les demandes de déplacements. Votre
travail consiste alors à afficher dans l’ordre chronologique les événements de
départ et d’arrivée des vélos. Pour cela on a besoin d’une file contenant les
vélos en cours de déplacement. Dans une première approche quand la station
de départ est vide, on ignore tout simplement l’événement, c’est à dire que la
demande de déplacement n’est pas prise en compte et que le cycliste parisien
prendra le métro. De même, si la station d’arrivée est pleine, l’événement
est ignoré, c’est à dire qu’il ne termine pas. Dans une deuxième approche on
se servira des coordonnées pour trouver la station disponible la plus proche
de celle demandée.
9
2.1.1 Gestion des heures
• Ecrire la fonctions AfficherHeure qui renvoie l’heure formatée de la
manière suivante : 12h05.
• Ecrire une fonction afficher qui permet d’afficher l’état courant d’une
station
10
• Une liste de déplacements plan permet de représenter les déplacements
planifiés
11
• On ajoute à la représentation d’une station, ses coordonnées (x,y) dans
la ville
• Dans le cas où une station est pleine, on dispose alors de 15 min
supplémentaires pour finir son déplaement. Modifier la fonction ar-
rivéeVelo(deplacement) en conséquence
12