Algorithmique TD2
L3 Informatique – ENS Cachan
Thomas Chatain
Exercice 1
Pour chacun des probl`emes suivants, proposer un algorithme it´eratif et un algorithme r´ecursif,
prouver leur correction et leur terminaison, et calculer leur complexit´e en temps et en espace.
1. Calcul de la factorielle d’un entier.
2. Calcul du n-i`eme terme de la suite de Fibonacci d´efinie par :
u0= 0
u1= 1
un=un2+un1,pour n > 1.
3. Calcul du PGCD de deux entiers par l’algorithme d’Euclide.
Exercice 2
On consid`ere un tableau A[1..n] qui contient toutes les valeurs de {0,1, . . . , n}sauf une. On
voudrait d´eterminer laquelle en temps lin´eaire.
Montrer comment r´esoudre ce probl`eme si les ´el´ements de Apeuvent ˆetre lus et copi´es en temps
constant.
On suppose maintenant qu’un acc`es ´el´ementaire dans Aest une lecture du i-`eme bit de A[j].
Montrer comment r´esoudre ce probl`eme en temps lin´eaire et en utilisant une m´emoire en O(log(n)).
Exercice 3
Lorsque des donn´ees sont stock´ees sur des supports physiques ou transmises dans un r´eseau,
il peut arriver que des bits d’information changent de valeur malencontreusement. Pour d´etecter
ces erreurs, on ajoute aux donn´ees quelques bits, appell´es bits de parit´e, dont la valeur est fix´ee
initialement en fonction des donn´ees. `
A l’aide des bits de parit´e, on peut v´erifier que les donn´ees
n’ont pas ´et´e endommag´ees.
Les codes de Hamming sont construits en ins´erant des bits de parit´e aux positions 1, 2, 4, 8. . .
qui sont des puissances de 2. Les autres positions (3, 5, 6, 7, 9, 10. . .) restent disponibles pour les
donn´ees. Pour chaque k, on positionne le bit de parit´e en position 2k`a 0 ou 1 de telle sorte qu’il
y ait un nombre pair de bits `a 1 parmi les bits dans les positions ntelles que bn
2kcest impair.
1. Construire le code de Hamming pour la donn´ee 11010001101.
2. Proposer un algorithme pour v´erifier l’int´egrit´e des donn´ees.
3. Adapter l’algorithme pour qu’il propose une correction dans le cas o`u les donn´ees ont ´et´e
alt´er´ees.
4. Que se passe-t-il si deux bits ont ´et´e modifi´es ?
5. Montrer comment d´etecter jusqu’`a trois erreurs en ajoutant un bit de parit´e suppl´ementaire.
1
Exercice 4
1. Donner la complexit´e en temps de l’algorithme vu `a l’´ecole primaire pour multiplier deux
entiers.
2. En observant que
(a×10k+b)(c×10k+d) = ac ×102k+ (ac +bd (ab)(cd)) ×10k+bd
proposer un algorithme de type diviser pour r´egner et calculer sa complexit´e en temps.
3. Adapter l’algorithme `a la multiplication de deux polynˆomes.
Exercice 5
Une file est une structure de donn´ees permettant de stocker une suite d’´el´ements, o`u les inser-
tions se font toutes d’un mˆeme cˆot´e et les suppressions toutes de l’autre cˆot´e ( `
A l’inverse des piles
dans lesquelles insertions et suppressions sont faites du mˆeme cˆot´e).
Impl´ementer l’ajout et la suppression dans une file `a l’aide de deux piles (avec du pseudocode,
ou bien un langage de votre choix).
Quel est le coˆut d’une op´eration dans le pire des cas ?
Calculer le coˆut amorti d’une op´eration.
Exercice 6
On souhaite impl´ementer une pile `a l’aide d’un tableau. Si on fixe la taille du tableau a priori,
on perd en efficacit´e pour deux raisons : lorsqu’il y a trop peu de donn´ees, beaucoup de place est
perdue ; lorsqu’il y a trop de donn´ees, on ne peut pas tout rentrer dans le tableau. Pour r´esoudre
ce probl`eme, on utilise des piles dynamiques dont la taille peut changer de telle sorte qu’au moins
la moiti´e du tableau est toujours remplie. L’op´eration qu’on veut impl´ementer est l’empilement :
elle consiste `a ins´erer l’´el´ement `a la premi`ere place libre lorsque le tableau n’est pas plein ; sinon,
on cr´ee un nouveau tableau de taille double du pr´ec´edent, on copie dedans tous les ´el´ements du
premier tableau puis on empile finalement l’´el´ement dedans.
On n´eglige le coˆut de l’allocation d’un tableau. Le coˆut `a mesurer est donc le nombre de copies
effectu´ees.
1. Impl´ementer la fonction empiler(x).
2. Quelle est la complexit´e de la fonction empiler dan le pire des cas ?
3. Calculer la complexit´e amortie de la fonction empiler(x) lorsqu’on commence par une pile
vide.
4. On consid`ere une proedure diff´erente empiler2(x) qui consiste `a augmenter la taille du
tableau d’une constante kplutˆot que de la doubler, lorsque le tableau est plein. Quelle est
la complexit´e amortie de cette proedure ?
5. Supposons qu’on veuille ´egalement une op´eration de d´epilement depiler(), qui consiste `a
effacer le dernier ´el´ement du tableau. Si la suppression du dernier ´el´ement r´esulte en un
tableau `a moiti´e plein, on cr´ee un tableau de taille divis´ee par deux et on copie les ´el´ements
du tableau dedans. Quel est le coˆut amorti des op´erations empiler(x) et depiler().
6. Montrer qu’un coˆut amorti lin´eaire peut ˆetre obtenu si on divise par deux la taille du tableau
quand le nombre d’´el´ements descend en dessous d’un quart.
2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !