Vous êtes sur la page 1sur 10

Fiche de Travaux dirigés

Conception et analyse des algorithmes INF351/IGE351


Partie 1
Exercice 1. Considérons l’algorithme de tri qui trie un vecteur en comptant, pour chacun de ses
éléments, le nombre d’éléments qui lui sont plus petits et ensuite utilise cette information pour
placer l’élément dans sa position finale dans le vecteur trié :

ALGORITHME ComparisonCountingSort(A[0..n – 1])


//Trie avec vecteur par comparaison des comptes
//Input : Un vecteur A[0..n – 1] de valeurs ordonnables
//Output : Un vecteur S[0..n – 1] formé des éléments de A classés par ordre croissant.
for i  0 to n – 1 do
Count[i]  0
for i  0 to n – 2 do
for j  i + 1 to n – 1 do
if A[i]  A[j]
Count[j]  Count[j] + 1
else Count[i]  Count[i] + 1
for i  0 to n – 1 do
S[Count[i]]  A[i]
return S

a) Appliquer cet algorithme pour trier la liste 60, 35, 81, 98, 14, 47.
b) Cet algorithme est-il stable ?
c) Est-il interne ?

Exercice 2. Décrire comment on peut implémenter chacune des opérations suivantes sur un
vecteur tel que le temps que ça prend ne dépende pas de la taille n du vecteur.
a) Supprimer le ième élément d’un vecteur ( 1  i  n )
b) Supprimer le ième élément dans un vecteur trié (le vecteur restant doit bien entendu
rester trié)
Exercice 3. Si vous résolvez le problème de recherche dans une liste de n nombres, comment
pouvez-vous prendre avantage du fait que la liste est connu être trié ? Donnez des réponses
séparées pour :
a) les listes représentées sous forme de vecteur.
b) les listes représentées sous forme de liste chaînée.
Exercice 4. a) Montrer le contenu de la pile après chacune des opérations de la séquence
suivante en commençant par la pile vide :
push(a), push(b), pop, push(c), push(d), pop
b) Montrer le contenu de la queue après chacune des opérations de la séquence suivante en
commençant par la queue vide :
enqueue(a), enqueue(b), dequeue, enqueue(c), enqueue(d), dequeue
Exercice 5. Pour chacun des algorithmes suivants, indiquer (i) une métrique naturelle de la
taille de son entrée ; (ii) son opération de base ; (iii) si le compte de l’opération de base peut
être différent pour des entrées de même taille.
a) Calcul de la somme de n nombres
b) Calcul de n!
c) Recherche du plus grand élément dans une liste de n nombres
d) Algorithme d’Euclide
e) Le sieve de Eratosthenes
f) Algorithme du stylo-et-crayon pour la multiplication de deux nombres décimaux de n
chiffres.

Exercice 6.
a) Considérons l’algorithme basé sur la définition pour la somme de deux matrices d’ordre
n. Quelle est l’opération de base ? Combien de fois elle est effectuée comme une
fonction de l’ordre n des matrices ? Comme une fonction du nombre total d’éléments
dans les matrices d’entrée ?
b) Répondre aux mêmes questions pour l‘algorithme basé sur la définition pour la
multiplication de deux matrices.
Exercice 7. Considérons une variante de la recherche séquentielle qui parcourt une liste pour
retourner le nombre d’occurrences de la clé de recherche donnée dans la liste. Son efficacité
sera-t-elle différente de l’efficacité classique de la recherche séquentielle ?
Exercice 8. Sélection des gants Il y a 22 gants dans un tiroir : 5 paires de gants rouges, 4
paires de gants jaunes et 2 paires de gants verts. Vous sélectionnez des gants dans l’obscurité
et vous ne pouvez les vérifier qu’après que la sélection soit effectuée. Quel est le plus petit
nombre de gants que vous avez besoin de sélectionner pour avoir au moins une paire de gants
identiques dans le meilleur cas ? dans le pire cas ?
Exercice 9. L’élimination de Gauss, l’algorithme de base pour la résolution des systèmes de n
1
équations linéaires à n inconnues, requiert environ n 3 multiplications, qui est l’opération de
3
base de l’algorithme.
a) Combien plus longtemps devriez-vous vous attendre à ce que l’élimination de Gauss
travaille sur un système de 1000 équations contre un système de 500 équations ?
b) Vous voulez acheter un ordinateur qui est 1000 fois plus rapide que celui que vous avez
actuellement. Par quel facteur l’ordinateur le plus rapide augmentera la taille des
systèmes solubles dans la même quantité de temps comme sur l’ancien ordinateur ?

Exercice 10. Pour chacune des fonctions suivantes, indiquer de combien la valeur de la fonction
changera si son argument augmente quatre fois.
a) log 2 n b) n c) n d) n 2 e) n 3 f) 2 n

Exercice 11. Indiquer si la première fonction de chacune des paires suivantes a un ordre de
croissance plus inférieur, égal ou supérieur (à une constante près) que la deuxième fonction.

a) n(n + 1) et 2000n 2 b) 100n 2 et 0.01n3 c) 2 n −1 et 2 n


d) log 2 n et ln n e) log 22 n et log 2 n 2 f) (n − 1)! et n!
Exercice 12. Calculer les sommes suivantes.
a) 1 + 3 + 5 + 7 + + 999 b) 2 + 4 + 8 + 16 + + 1024
n +1 n +1
c) 1
i =3
d) i
i =3
n −1 n n n
e)  i(i + 1)
i =0
f)  3 j+1
j =1
g)  ij
i =1 j =1
n
1
h)  i(i + 1)
i =1

Exercice 13. Trouver l’ordre de croissance des sommes suivantes :

 (i )
n −1 n −1

 lg i
2
a) 2
+1 b) 2

i =0 i =1

n n −1 i −1
c)  (i + 1)2
i =1
i −1
d)  (i + j )
i =0 j =0

Utiliser la notation (g (n) ) avec la fonction g (n) la plus simple possible.

Exercice 14. La variance empirique de n observations x1 ,, xn peut être calculée comme

 
n n
( xi − x ) 2 x
i =1
où x = i =1 i

n −1 n
ou
 x − (i =1 xi ) 2 / n
n 2 n
i =1 i

n −1
Trouver et comparer le nombre de divisions, multiplications, et additions/soustractions
(additions et soustractions sont souvent prises ensemble) qui sont nécessaires pour calculer la
variance suivant chacune des deux formules.

Exercice 15. Considérons l’algorithme suivant.


ALGORITHME Mystery(n)
//Input : Un entier naturel n
S 0 ;
for i  1 to n do
S  S + i*i
return S
a) Que calcule cet algorithme?
b) Quelle est son opération de base ?
c) Combien de fois cette opération de base est-elle exécutée ?
d) Quelle est la classe d’efficacité temporelle de cet algorithme ?
e) Proposer une amélioration ou un meilleur algorithme et indiquer sa classe d’efficacité.
Si vous ne pouvez pas le faire, essayer de montrer pourquoi cela est impossible.

Exercice 16. Considérons l’algorithme suivant.

ALGORITHME Secret(A[0..n – 1])


//Input : Une vecteur A[0..n – 1] de nombres réels
minval  A[0] ; maxval  A[0]
for i  1 to n – 1 do
if A[i]  minval
minval  A[i]
if A[i]  maxval
maxval  A[i]
return maxval – minval

Répondre aux question (a)–(e) de l’exercice 15 au sujet de cet algorithme.

Exercice 17. Considérons l’algorithme suivant.

ALGORITHME Enigma(A[0..n – 1, 0..n – 1])


//Input : Une matrice A[0..n – 1, 0..n – 1] de nombres réels
for i  0 to n – 2 do
for j  i + 1 to n – 1 do
if A[i, j]  A[j, i]
return faux
return vrai

Répondre aux question (a)–(e) de l’exercice 15 au sujet de cet algorithme.

Exercice 18. Améliorer l’implémentation de l’algorithme de multiplication des matrices en


réduisant le nombre d’additions effectuées par l’algorithme. Quel effet aura cette modification
sur l’efficacité de l’algorithme ?

Exercice 19. Considérons la version suivante d’un algorithme important que nous étudierons
plus tard dans ce cours.

ALGORITHME GE(A[0..n – 1, 0..n])


//Input : Une matrice n par n + 1, A[0..n – 1, 0..n] de nombres réels
for j  i + 1 to n – 1 do
for k  i to n do
A[j, k]  A[j, k] – A[i, k]*A[j, i]/A[i, i]

a) Trouver la classe d’efficacité temporelle de cet algorithme.


Quelle inefficacité contient cet algorithme et comme peut-elle être éliminée pour accélérer
l’algorithme ?
Exercice 20. Considérons l’algorithme récursif suivant pour le calcul de la somme des n
premiers cubes : S (n) = 13 + 23 +  + n3 .
ALGORITHME S(n)
//Input : Un entier naturel n
//Output : La somme des n premiers cubes
if n = 1 return 1
else return S(n – 1) + n*n*n
a) Ecrire une relation de récurrence du nombre de fois que l’opération de base de cet
algorithme est exécutée.
b) Comment cet algorithme se compare-t-il avec la version directe non récursive de
l’algorithme de calcul de cette somme ?
Exercice 21. Considérons l’algorithme récursif suivant.
ALGORITHME Q(n)
//Input : Un entier naturel n
if n = 1 return 1
else return Q(n – 1) + 2*n – 1
a) Ecrire une relation de récurrence pour les valeurs de cette fonction et résolvez là pour
déterminer ce que cet algorithme calcul.
b) Ecrire une relation de récurrence pour le nombre de multiplications effectuées par cet
algorithme et la résoudre.
c) Ecrire une relation de récurrence pour le nombre d’additions/soustractions effectuées
par cet algorithme et la résoudre.
Exercice 22. Les tours de Hanoi Dans la version originale du puzzle des tours de Hanoi, comme
il avait été publié par Edouard Lucas, un mathématicien Français, dans les années 1890, le
monde prendra fin après que 64 disques soient déplacés à partir d’un tour mystique de Brahma.
a) Estimez le nombre d’années qu’il faudra prendre si les moines peuvent déplacer un
disque par minute. (On suppose que les moines ne mangent pas, ne dorment pas et ne
meurent pas).
b) Concevoir un algorithme non récursif pour résoudre le puzzle des tours de Hanoi.
c) Combien de mouvements sont effectués par le ième plus grand disque dans cet
algorithme ?
Exercice 23.
a) Montrer que le nombre exact d’additions effectuées par l’algorithme récursif BinRec(n)
pour un nombre décimal entier positif est log 2 n .
b) Ecrire une relation de récurrence pour le nombre d’additions effectuées par la version
non récursive de cet algorithme et la résoudre.
Exercice 24.
a) Concevoir un algorithme récursif pour calculer 2 n pour des entiers naturels n qui est
basé sur la formule : 2n = 2n−1 + 2n−1
b) Ecrire une relation de récurrence pour le nombre d’additions effectuées l’algorithme et
la résoudre.
c) Dessinez un arbre des appels récursifs pour cet algorithme et compter le nombre
d’appels effectués par l’algorithme.
d) Existe-t-il un bon algorithme pour résoudre ce problème ?
Exercice 25. Considérons l’algorithme récursif suivant.
ALGORITHME Min1(A[0..n – 1])
//Input : Un vecteur A[0..n – 1] de nombres réels
if n = 1 return A[0]
else temp  Min1(A[0..n – 2])
if temp  A[n – 1] return temp
else return A[n – 1]
a) Que calcule cet algorithme ?
b) Ecrire une relation de récurrence pour le compte de l’opération de base de cet algorithme
et la résoudre.
Exercice 26. Considérons l’algorithme récursif suivant.
ALGORITHME Min2(A[inf..sup])
//Input : Un vecteur A[0..n – 1] de nombres réels
if inf = sup return A[inf]
else temp1  Min2(A inf ..(inf + sup) / 2)
temp2  Min2(A (inf + sup) / 2 + 1..sup )
if temp1  temp2 return temp1
else return temp2
a) Ecrire une relation de récurrence pour le compte de l’opération de base de cet algorithme
et la résoudre.
Lequel des algorithmes Min1 et Min2 est plus rapide ? Pouvez-vous suggérer un algorithme
pour le problème qu’ils résolvent qui sera plus efficace que les deux ?
Exercice 27. a) Donnez un exemple d’algorithme qui ne sera pas considéré comme une
application de l’approche de la force brute.
b) Donnez un exemple de problème qui ne peut pas être résolu par un algorithme de la force
brute.

Exercice 28. Quelle est l’efficacité de l’algorithme de la force brute pour le calcul de a n comme
une fonction de n ? Comme une fonction du nombre des bits de la représentation binaire de n ?

b) Si vous devez calculer a n mod m , où a  1 et n est un grand entier positif, comment pouvez-
vous contourner le problème d’une très magnitude de a n ?

Exercice 29. Ecrire un algorithme de la force brute pour évaluer le polynôme

p( x) = an x n + an−1 x n−1 +  + a1 x + a0

en un point donné x0 et déterminer la classe d’efficacité au pire.


( )
b) Si l’algorithme que vous avez conçu est dans  n 2 , concevoir un algorithme linéaire pour
ce problème.
c) Est-il possible de concevoir un algorithme ayant une efficacité meilleure que l’efficacité
linéaire pour ce problème ?
Exercice 30
Le déterminant d’une matrice d’ordre n

 a11  a1n 
A =    
an1  ann 

Dénoté det(A), peut être définie par a11 pour n = 1, et pour n  1 par la formule récursive
n
det( A) =  s j a1 j det( A j )
j =1

où s j est égale à +1 si j’est impair et -1 si j’est pair, a1 j est l’élément de la première ligne et la
colonne j, et A j est la matrice d’ordre n – 1 obtenue à partir de A en supprimant sa ligne 1 et sa
colonne j.
a) Ecrire une relation de récurrence pour le nombre de multiplications effectuées par
l’algorithme qui implémente cette définition récursive.
b) Sans résoudre cette récurrence, que pouvez-vous dire concernant l’ordre de croissance
de la solution comparé à n! ?
Exercice 21
Pouvez-vous concevoir un algorithme plus rapide que celui basé sur la stratégie de la force
brute pour résoudre le problème de la paire la plus proche pour n points x1 ,, xn de la droite
réelle ?
Exercice 32
Soient x1  x2    xn des nombres réels représentant les coordonnées de n villages situés le
long d’une route droite. Un poste de police doit être construit dans l’un de ces villages.
a) Concevoir un algorithme efficace pour déterminer la position du poste de police qui
minimise la distance moyenne entre les villages et le poste de police.
b) Concevoir un algorithme efficace pour déterminer la position du poste de police qui
minimise la distance maximum d’un village au poste de police.
Exercice 33
Le problème de la paire la plus proche peut être posé dans un espace k-dimensionnel dans lequel
la distance euclidienne entre deux points x = ( x1 ,, xs ) et y = ( y1 ,, ys ) est définie par
k
d ( x, y ) =  (x − ys ) .
2
s
s =1

Quelle sera la classe d’efficacité de l’algorithme de la force brute pour le problème k-


dimensionnel de la paire la plus proche ?

Exercice 34
a) Ecrire un pseudocode pour l’algorithme du diviser-pour-régner pour trouver les valeurs
du plus petit et du plus grand élément dans un vecteur de n nombres.
b) Ecrire et résoudre (pour n = 2k ) la relation de récurrence du nombre de comparaisons
clés effectuées par votre algorithme.
c) Comparer votre algorithme avec l’algorithme de la force brute de ce problème.

Exercice 35

a) Ecrire un pseudocode pour l’algorithme du diviser-pour-régner pour le problème


d’exponentiation du calcul de a n où a  0 et n est un entier positif.
b) Ecrire et résoudre la relation de récurrence du nombre de multiplications effectuées par
cet algorithme.
c) Comparer votre algorithme avec l’algorithme de la force brute de ce problème.

a) Résoudre la relation de récurrence du le nombre de comparaisons clés effectuées par le


tri fusion dans le pire cas. Vous pouvez supposer que n = 2k .
b) Ecrire la relation de récurrence du nombre de comparaisons clés effectuées par le tri
fusion dans le meilleur cas et la résoudre pour n = 2k .
c) Résoudre la relation de récurrence du le nombre de mouvements clés effectuées par la
version du tri fusion présenté à la Section 4.1. Le fait de prendre en compte le nombre
de mouvements clés change-t-il la classe d’efficacité de l’algorithme ?

Exercice 36

Soit un vecteur de n nombres réels distincts. Une paire (A[i], A[j]) est dite être une inversion si
ces nombres ne sont pas dans l’ordre, c’est-à-dire i  j mais A[i]  A[j]. Concevoir un algorithme
(n log n) pour compter le nombre d’inversions

Exercice 37
Concevoir un algorithme qui réarrange les éléments d’un vecteur de n nombres réels tels
que ses éléments négatifs précèdent tous ses éléments positifs. Votre algorithme doit être à la
fois efficace en temps et en mémoire.

Exercice 38
Résoudre la récurrence Cworst (n) = Cworst (n / 2) + 1 , pour n  1, Cworst (1) = 1, pour n = 2 k par
substitution arrière.

Exercice 39

a) Démontrer l’égalité log 2 n + 1 = log 2 (n + 1) , pour n  1.

b) Montrer que Cworst (n) = log 2 n + 1 vérifie la relation (4.2) pour tout entier positif impair
n.
Exercice 40
Ecrire un pseudocode pour un des algorithmes de parcours classiques pour un arbre binaire. En
supposant que votre algorithme est récursif, trouver le nombre d’appels récursifs effectués.

Exercice 41
Lequel des algorithmes classiques de parcours produit une liste triée si elle appliquée à un arbre
binaire de recherche ? Démontrer cette propriété.

Exercice 42
Parcourir l’arbre binaire suivant : a) en préordre, b) en inordre, c) en postordre

b c

d e f

Exercice 43
a) Dessiner un arbre binaire ayant dix nœuds étiquetés de 0 à 9 de telle sorte que les parcours
en inordre et postordre de l’arbre produisent les listes suivantes : 9, 3, 1, 0, 4, 2, 7, 6, 8, 5
(inordre) et 9, 1, 4, 0, 3, 6, 7, 5, 8, 2 (postordre).

Exercice 44
Est-il possible d’implémenter le tri par insertion pour trier les listes chaînées ? Aura-t-elle la
même efficacité (n 2 ) que la version vecteur ?

Exercice 45
Considérons la version suivante du tri par insertion
ALGORITHME InsertSort2(A[0..n – 1])
for i  1 to n – 1 do
ji–1
while (j  0) and (A[j]  A[j + 1]) do
swap(A[j], A[j + 1])]
jj–1

Quelle est son efficacité temporelle ? Comment est-elle comparée à celle de la version donnée
dans le cours ?

Exercice 45
Soit A[0..n −1] un ensemble de n éléments ordonnables. (Pour la simplicité, vous pouvez
supposer que tous les éléments son distincts.) Une paire ( A[i], A[ j ]) est appelée une inversion
si i  j et A[i]  A[j].
a) Quels sont les vecteurs de taille n qui ont le plus grand nombre d’inversions et quel est
ce nombre ? Répondre aux mêmes questions pour le plus petit nombre d’inversions.
b) Montrer que le nombre de comparaisons clés dans le cas moyen du tri par insertion est
donné par la formule
n2
Cavg (n)  .
4

Exercice 46
Le tri par insertion dichotomique utilise la recherche binaire pour trouver une position
appropriée pour insérer A[i] parmi les éléments déjà triés A[0]    A[i −1]) . Déterminer la
classe d’efficacité au pire de cet algorithme.

Exercice 47
Le Shellsort est un algorithme important qui marche en appliquant le tri par insertion à plusieurs
sous listes entremêlées d’une liste donnée. A chaque passage à travers la liste, les sous listes en
question sont construites en faisant des pas dans la liste avec un incrément hi pris une suite
certaine suite prédéfinie de tailles de pas h1    hi    1 , devant se terminer par 1.
(L’algorithme marche n’importe quelle suite de ce genre, bien que certaines suites sont connues
produire une meilleure efficacité que d’autres. Par exemple, la suite 1, 4, 23, 40, 121,…, utilisé
bien entendu dans l’ordre inverse, est connue être la meilleure à ce propos).
a) Applique le shellsort à la liste

S H E L L S O R T I S U S E F U L

b) Le shellsort est-il un algorithme de tri stable ?


C) Implémenter le Shellsort, le tri par insertion directe, le tri par insertion dichotomique, le
tri par fusion et le Quicksort dans le langage de programmation de votre choix et calculer
leur performance sur des vecteurs aléatoires de tailles 102, 103, 104 et 105 ainsi que sur
des vecteurs croissants et décroissants de ces tailles.

Vous aimerez peut-être aussi