14 mai 2020 - 10h15-12h15 Licence Informatique - Semestre 4 ASD
DM2 - dur´ee 2h00 (temps de rendu sur Moodle compris)
Consignes de rendu :
Date : mardi 14 mai 2020 - 10h15-12h15 Lieu : `a d´eposer sur le cours Moodle
Format : le devoir doit ˆetre r´edig´e de mani`ere manuscrite sur feuille (ayez une ´ecriture appliqu´ee) et l’ensemble des feuilles doivent ˆetre prises en photo (ou scan) et d´epos´ees sur Moodle (attention Moodle accepteau maximum 10 fichierset au maximum 50Mopar rendu).
Vous devez conserver votre copie de mani`ere `a pouvoir la produire sur demande.
Ce devoir comporte4exercices. Pour simplifier la lecture, l’´enonc´e de chaque exercice est sur une page.
La clart´e des explications et justifications sera un ´el´ement important pris en compte lors de la cor- rection.
C’est un travail individuel qui est demand´e.
INDIQUEZ : votre NOM, votre NUMERO DU GROUPE, votre NU- MERO D’ETUDIANT et NUMEROTEZ VOS PAGES
Exercice 1 : Quelques questions sur la complexit´e
Comp´etence ´evalu´ee : savoir restituer les connaissances du cours.
Q 1.1 Si je prouve qu’un algorithme est en Ω(n3), peut-il ˆetre en Θ(n2) ? R´epondre par oui ou non et justifier.
Corrig´e
Non. Si le meilleur des cas est en Ω(n3), aucun cas ne peut aveoir une complexit´e inf´erieur, orn2< n3∀n >1 Q 1.2 Si je prouve qu’un algorithme est en Θ(2n) dans le pire des cas, peut-il ˆetre en Ω(3n) ? R´epondre par oui ou non et justifier.
Corrig´e
Non. Si le pire des cas est Θ(2n), il ne peut y avoir des cas de complexit´e plus grande que 2n. Q 1.3 On peut r´esoudre l’´equation de r´ecurrence c(n) = 3c(27n) +√
n en utilisant le th´eor`eme g´en´eral.
R´epondre par vrai ou faux et justifier.Corrig´e Oui. a = 3, b = 27,log27(3) = 13. f(n) = √
n =n12 = Ω(nlog27(3)+ε). On est dans le cas 3 du th´eor`eme g´en´eral. De plus aveck=34 on a 3pn
27 < k√
n. Donc le th´eor`eme g´en´eral est applicable.
Q 1.4 Le tri fusion ne poss`ede pas de meilleur ou de pire des cas (pour le nombre asymtotique de compa- raisons). R´epondre par vrai ou faux et justifier.Corrig´e
Vrai. La fusion de deux tableaux tri´es admet un pire et un meileur des cas mais de mˆeme complexit´e asymptotique. Ou bien dire que le r´esultat du cours est une complexit´e en Θ(nlogn).
On s’int´eresse ici au calcul de l’exponentielle xn o`u nest un entier positif ou nul. Voici une proposition de code Python r´ealisant ce calcul :
def e x p o _ b r u t e ( x , n ):
a s s e r t ( n >= 0) if n == 0:
r e t u r n 1 e l s e :
r e t u r n x * e x p o _ b r u t e ( x , n -1)
Q 1.5 Est-ce une r´ecursivit´e terminale ? Justifier.
Corrig´e
Non. Une op´eration de multiplication est r´ealis´ee apr`es l’appel r´ecursif.
Q 1.6 Donner l’´equation de r´ecurrence qui calcule le nombre de multiplications pour ´elever un nombrex
`
a la puissance nen utilisantexpo brute.
Corrig´e
c(0) = 0,c(n) = 1 +c(n−1)
Q 1.7 R´esoudre cette ´equation et donner le comportement asymptotique de l’algorithme.
Corrig´e
c(n) =n= Θ(n)
Exercice 2 : Occurrences d’un mot dans un texte
Comp´etence ´evalu´ee : ´evaluer la complexit´e d’un algorithme, identifier pire et meilleur des cas.
On cherche `a calculer toutes les positions d’occurrence d’un motudans un textet(i.e toutes les positions o`u le mot apparaˆıt).
def o c c u r r e n c e s ( t , u ):
n = len ( t ) m = len ( u )
for p in r a n g e ( n - m + 1 ) : i = 0
w h i l e i < m and t [ p + i ] == u [ i ]:
i +=1 if i == m :
p r i n t ( " o c c u r r e n c e en p o s i t i o n " + str ( p )) Pour n(la longueur de t) et m (la longueur deu) fix´es :
Q 2.1 D´ecrire un pire des cas pour le nombre de comparaisons de caract`eres.
Corrig´e
Il faut que uapparaisse `a chaque position de tpour s’assurer qu’on r´ealise des comparaisons avec toutes les lettres deu`a chaque position det.
test une r´ep´etition denfois la lettrextandis queuest la r´ep´etition demfois la lettrex. Ainsi toutes les positions detsont test´ees et toutes les positions deuaussi.
Q 2.2 Calculer le nombre exact de comparaisons de caract`eres r´ealis´ees dans le pire des cas.
Corrig´e
c(n) =
n−m
X
i=0 m−1
X
j=0
1 =
n−m
X
i=0
m=m×(n−m+ 1)
Q 2.3 D´ecrire un meilleur des cas pour le nombre de comparaisons de caract`eres.
Corrig´e
u[0] n’apparaˆıt pas danst. On a donc un ´echec `a la premi`ere comparaison.
Q 2.4 Calculer le nombre exact de comparaisons de caract`eres r´ealis´ees dans le meilleur des cas.
Corrig´e
c(n) =
n−m
X
i=0
1 =n−m+ 1
Exercice 3 : Files avec liste sentinelle
Comp´etence ´evalu´ee : comprendre et utiliser une structure de donn´ee.
On choisit d’implanter une file en utilisant une liste avec sentinelle. On rappelle (voir cours) qu’une liste avec sentinelle est une liste doublement chaˆın´ee avec une cellule1 particuli`ere dont le suivant pointe vers la premi`ere ’vraie’ cellule (i.e. contenant une valeur) et le pr´ec´edent pointe vers la derni`ere cellule. Le sch´ema ci-dessous illustre une liste avec sentinelle contenant 3 valeurs.
None
`
0 4 8
En Python, on fait le choix de mod´eliser la liste avec sentinelle avec des dictionnaires et de prendre pour convention que la cellule sentinelle contient la valeur None et que les autres cellules contiennent une valeur diff´erente deNone (ce afin de pouvoir identifier facilement la sentinelle).
Une file2 vide est mod´elis´ee par une liste avec sentinelle sans ´el´ement. Elle contient donc une seule cellule : la cellule sentinelle.
def e m p t y _ q u e u e ():
s e n t i n e l = { ’ v a l u e ’ : None , ’ n e x t ’ : None , ’ p r e v ’ : N o n e } s e n t i n e l [ ’ n e x t ’ ] = s e n t i n e l
s e n t i n e l [ ’ p r e v ’ ] = s e n t i n e l r e t u r n s e n t i n e l
Enfiler un ´el´ement dans une file s’´ecrit ainsi :
def e n q u e u e ( q , v ):
a s s e r t ( v is not N o n e ) f i r s t _ c e l l = q [ ’ n e x t ’ ] s e n t i n e l = q
n e w _ c e l l = { ’ v a l u e ’ : v , ’ n e x t ’ : f i r s t _ c e l l , ’ p r e v ’ : s e n t i n e l } s e n t i n e l [ ’ n e x t ’ ] = n e w _ c e l l
f i r s t _ c e l l [ ’ p r e v ’ ] = n e w _ c e l l
Q 3.1 Dessiner la repr´esentation d’une liste avec sentinelle vide.
Corrig´e
Q 3.2 Dessiner la repr´esentation d’une liste avec sentinelle avec un ´el´ement.
Corrig´e
1. Un triplet stockant la valeur, une r´ef´erence vers la cellule suivante, une r´ef´erence vers la cellule pr´ec´edente 2. On rappelle qu’un file se dit queue en anglais, enfiler se dit enqueue et defiler se dit dequeue
Q 3.3 Dessiner la repr´esentation de la liste avec sentinelle repr´esentant la file lorsqu’on a ex´ecut´e le code suivant :
q = e m p t y _ q u e u e () e n q u e u e ( q ,1)
e n q u e u e ( q ,2) e n q u e u e ( q ,3)
Corrig´e
Q 3.4 Donner le code Python de la fonction dequeue(d´efiler) qui prend en entr´ee une file, modifie la file, et retourne l’´el´ement qui sort de la file. Cette fonction d´eclenchera l’exception Exception dans la cas o`u il n’y a pas d’´el´ement `a d´efiler3.
Corrig´e
def d e q u e u e ( f ):
l a s t _ c e l l = f [ ’ p r e v ’ ]
if l a s t _ c e l l [ ’ v a l u e ’ ] == N o n e : r a i s e E x c e p t i o n ( " " )
l a s t _ c e l l [ " p r e v " ][ " n e x t " ] = l a s t _ c e l l [ " n e x t " ] l a s t _ c e l l [ " n e x t " ][ " p r e v " ] = l a s t _ c e l l [ " p r e v " ] r e t u r n l a s t _ c e l l [ ’ v a l u e ’ ]
Exercice 4 :
Comp´etence ´evalu´ee : concevoir un algorithme avec une complexit´e cible, r´einvestir ses connais- sances.
On se propose de traiter le probl`eme suivant : on dispose d’un tableau t de n valeurs tri´ees et d’un tableauu de mvaleurs non tri´ees et on veut construire un tableau den+m valeurstri´ees.
Remarquez que lorsqu’on r´ealise cette tˆache, on a n´ecessairement une complexit´e en espace en Ω(n+m) puisqu’on est oblig´e de construire un nouveau tableau pour le r´esultat.
Q 4.1 D´ecrire un algorithme, en fran¸cais ou en pseudo-code ou en Python, qui r´ealise cette tˆache et dont la complexit´e en nombre de comparaisons d’´el´ements est O(mlog(n+m)).
Corrig´e
On recopie le tableautdans un nouveau tableau de taillen+mpuis les valeurs du tableauuensuite. Puis on ins`ere par dichotomie (avec la partie d’insertion par dichotomie du tri insertion) chacune desmvaleurs non tri´ee.
Q 4.2 Justifier pr´ecis´ement de la complexit´e de votre algorithme.
Corrig´e
L’insertion de la premi`ere valeur se fait enO(log(n)), l’insertion de la deuxi`eme valeur se fait enO(log(n+
1)), ..., l’insertion de lam−i`eme valeur se fait enO(log(n+m−1)). Cette somme est enO(mlog(n/m)).
Q 4.3 D´ecrire un algorithme, en fran¸cais ou en pseudo-code ou en Python, qui r´ealise cette tˆache et dont la complexit´e en nombre de comparaisons d’´el´ements est O(n+m+mlogm).
Corrig´e
Je commence par trier le tableau u dans un tableau v puis j’ins`ere les valeurs de v et t en parcourant lin´eairement les deux tableaux (comme dans le TP1).
Q 4.4 Justifier pr´ecis´ement de la complexit´e de votre algorithme.
Corrig´e
Le tri de u requiert O(mlogm) comparaisons en utilisant un tri fusion. Le parcours de t et v requiert n+mcomparaisons dans le pire des cas.
On suppose maintenant que les donn´ees en entr´ee (les ´el´ements de t etu) sont dans des listes doublement chaˆın´ees. Cette fois il n’est pas n´ecessaire de cr´eer de nouvel espace, la liste r´esultat ´etant un r´earrangement des listes initiales, on a donc une complexit´e en espace en Θ(1).
Q 4.5 Est-ce que l’un ou l’autre, ou les deux algorithmes des questions pr´ec´edentes sont adapt´es `a cette structure de donn´ees ? Expliquer.
Corrig´e
L’insertion par dichotomie ne peut pas fonctionner correctement sur les listes car on ne peut pas acc´eder
`
a n’importe quelle cellule de la liste en temps constant.
Par contre le second algorithme est plus appropri´e sauf qu’il n´ecessite de trieru. Le tri d’une liste chaˆın´ee avec le tri fusion est r´ealisable.