Vous êtes sur la page 1sur 18

Université de Ngaoundéré Année Académique 2018/2019

Faculté des Sciences Licence 3


Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

EXERCICES 1.1

Problème 1. Démontrer l’égalité gcd( m, n)  gcd( n, m mod n) pour toute paire d’entiers
positifs m et n.
Problème 2. Que fait l’algorithme d’Euclide pour une paire de nombres dont le premier est
plus petit que le second ? Quel le maximum de fois que ceci peut se produire pendant
l’exécution de l’algorithme sur de telles entrées ?
Problème 3.
a) Quel est le plus petit nombre de divisions effectuées par l’algorithme d’Euclide pour
toutes les entrées 1  m, n  10
b) Quel est le plus grand nombre de divisions effectuées par l’algorithme d’Euclide pour
toutes les entrées 1  m, n  10 ?

EXERCICES 1.2

Problème. Considérons l’algorithme suivant pour trouver la distance est les éléments plus
proches dans un vecteur de nombres.

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


//Input : un vecteur de nombres
//Output : La distance minimum entre deux de ses plus proches éléments
dmin  
for i  0 to n – 1 do
for j  0 to n – 1 do
if i  j and |A[i] – A[j]|  dmin
dmin  |A[i] – A[j]|
return dmin
Faites autant d’améliorations que vous pouvez dans cette solution algorithmique du problème.
(Si vous voulez aussi, vous pouvez aussi changer l’algorithme ; sinon améliorer
l’implémentation donnée).

EXERCICES 1.3

Problème 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é :

1
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

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 ?

Problème 2. Les ponts de Königsberg. Le puzzle des ponts de Königsberg est universellement
accepté comme problème qui a donné naissance à la théorie des graphes. Il a été résolu par le
grand mathématicien d’origine Suisse Léonard Euler (1707-1783). Le problème demandait si
on pourrait, en une seule promenade, traverser chacun des sept ponts de la cité de Königsberg
exactement une fois et revenir au point de départ. Ci-dessous un croquis du fleuve avec ses
îles et ses sept ponts.

a) Formuler ce problème comme un problème de graphe.


b) Ce problème a-t-il une solution? Si vous le croyez, dessiner une telle promenade; si
vous ne croyez pas, expliquer pourquoi et indiquer le plus petit nombre de nouveaux
ponts qui seraient exigés pour rendre une telle promenade possible.

Problème 3. On considère la carte suivante :

b
a

c d

e f

2
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

a) Expliquer comment vous pouvez utiliser le problème de coloriage des graphes pour
colorier la carte tel que deux régions voisines ne soient pas coloriées par la même
couleur.
b) Utiliser la réponse de la question (a) pour colorier la carte avec le plus petit nombre de
couleurs.

EXERCICES 1.4
Problème 1. 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é)

Problème 2.
a) Soit A la matrice d’adjacence d’un graphe non orienté. Expliquez quelle propriété de la
matrice indique que :
i. Le graphe est complet
ii. Le graphe a une boucle, c’est-à-dire un arc reliant un sommet à lui-même.
iii. Le graphe a un sommet isolé, c’est-à-dire un sommet n’ayant pas d’arc incident.
b) Répondre aux mêmes questions pour la représentation sous forme de listes
d’adjacence.

3
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

EXERCICES 2.1

Problème 1. Pour chacune des fonctions suivantes, indiquer de combien la valeur de la


fonction changera si son argument augmente quatre fois.
a) log2 n b) n c) n d) n 2 e) n 3 f) 2 n

Problème 2. 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) log2 n et ln n
e) log22 n et log2 n 2 f) (n  1)! et n!

EXERCICES 2.2

Problème 1. Utiliser les définitions formelles de O,  et  pour déterminer si les assertions


suivantes sont vraies ou fausses.
a) n(n  1)  n 3  b) n(n  1)  n 2 
1 1
2 2
c) n(n  1)  n 3  d) n(n  1)  n 
1 1
2 2

Problème 2. Nous avons mentionné dans cette section que l’on peut vérifier si tous les
éléments d’un vecteur sont distincts par un algorithme à deux parties basé sur le tri préalable
du vecteur.
a) Si le tri préalable est effectué par un algorithme ayant une efficacité temporelle
appartenant à nlog n  , quelle sera la classe d’efficacité temporelle de l’algorithme
complet ?
b) Si l’algorithme de tri utilisé pour le tri préalable a besoin d’un vecteur additionnel de
taille n, quelle sera la classe d’efficacité mémoire de l’algorithme complet ?

EXERCICES 2.3

Problème 1. 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2i1
i 1
d)  (i  j )
i 0 j 0

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

4
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

Problème 2. 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.

Problème 3. 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) du problème 4 au sujet de cet algorithme.

Problème 6. 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) du problème 4 au sujet de cet algorithme.

Problème 7. 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 ?

5
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

EXERCICES 2.4
Problème 1. Résoudre les équations de récurrence suivantes :
a) x(n)  x(n 1)  5 pour n  2 , x(1)  0
b) x(n)  3x(n 1) pour n  2 , x(1)  4
c) x(n)  x(n 1)  n pour n  1 , x(0)  0
d) x(n)  x(n / 2)  n pour n  2 , x(1)  1 (résoudre pour n  2k )
e) x(n)  x(n / 3)  n pour n  2 , x(1)  1 (résoudre pour n  3k )

Problème 2. 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 ?
Problème 3. 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.

Problème 4.
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 ?

6
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

Problème 5. 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.
Problème 6. 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.
b) 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 ?

EXERCICES 2.5

Problème 1. Considérons l’algorithme basé sur la définition pour le calcul du nième nombre
de Fibonacci F(n). Soient C(n) et Z(n) le nombre de fois que F(1) et F(0) sont calculés,
respectivement. Montrer que

a) C(n) = F(n) b) Z(n) = F(n – 1).

Problème 2. Améliorer l’algorithme Fib pour qu’il requière seulement (1) mémoire.

Problème 3. Démontrer l’égalité

 F (n  1)
n
F (n)  0 1
 F (n)  , pour n  1
 F (n  1) 1 1

7
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

Problème 4. Dans un langage de votre choix, implémentez deux algorithmes pour le calcul
des cinq derniers chiffres du nième nombre Fibonacci qui sont basés sur (a) l’algorithme basé
su la définition récursive de F(n) ; (b) l’algorithme itératif basé sur la définition de Fib(n).
Réaliser une expérience pour trouver la plus grande valeur de n pour laquelle vos programmes
s’exécutent en moins d’une minute sur votre ordinateur.

EXERCICES 2.6
Problème 1. Considérons l’algorithme de tri bien connu suivant avec un compteur inséré pour
compter le nombre de comparaisons clés.
ALGORITHME SortAnalysis(A[0..n – 1])
//Input : Un vecteur A[0..n – 1] de n éléments ordonnables
//Output : Le nombre total de comparaisons clés effectuées
count  0
for i  0 to n – 1 do
v  A[i]
ji–1
while j  0 and A[j]  v do
count  count + 1
A[j + 1]  A[j]
jj–1
A[j + 1]  v
return count
Le compteur de comparaisons est-il placé au bon endroit? Si vous pensez oui, justifier votre
réponse ; si vous pensez non, faites une correction appropriée.

Problème 2. Quelle échelle de transformation permettra à un diagramme logarithmique


d’avoir une forme linéaire.
Problème 3. Comment peut-on distinguer d’un diagramme pour un algorithme appartenant à
(loglog n) au diagramme d’un algorithme appartenant à (logn) ?

Problème 4.
a) Trouver empiriquement le plus grand nombre de divisions effectuées par l’algorithme
d’Euclide pour calculer GCD(m, n) pou 1  n  m  100 .
b) Pour chaque entier positif k, trouver empiriquement la plus petite paire d’entiers
1  n  m  100 pour laquelle l’algorithme d’Euclide a besoin d’effectuer k divisions
dans le but de trouver GCD(m, n).

8
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

EXERCICES 3.1
Problème 1.
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.

Problème 2.
a) 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 ?

Problème 3.
a) 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 ?

EXERCICES 3.2

Problème 1. Déterminer le nombre de comparaisons de caractères qui seront effectués par


l’algorithme de la force brute en cherchant la forme GANDHI dans le texte
THERE_IS_MORE_TO_LIFE_THAN_INCREASING_ITS_SPEED
On suppose que la longueur du texte est connue avant que la recherche commence.

Problème 2. Combien de comparaisons (à la fois pour les recherches positives et négatives)


seront effectuées par l’algorithme de la force brute en cherchant chacune des formes suivantes
dans une chaîne binaire de mille zéros ?
a) 00001 b) 10000 c) 01010
Problème 3. En résolvant le problème de la reconnaissance des formes, y aura-t-il un
avantage à comparer la forme et le texte de la droite vers la gauche plutôt que de la gauche
vers la droite ?

9
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

EXERCICES 3.3

Problème 1. 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.
Problème 2. 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
s 1
s  ys  .
2

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 ?

EXERCICES 3.4
Problème 1. Considérons le problème de la clique : étant donné un graphe G et un entier
positif k, déterminer si le graphe contient une clique de taille k, c’est-à-dire un sous-graphe
complet de k sommets. Concevoir un algorithme de recherche exhaustive pour ce problème.
Problème 2. Expliquez comment la recherche exhaustive peut être appliquée au problème de
tri et déterminer la classe d’efficacité d’un tel algorithme.
Problème 2. Carrés magiques Un carré magique d’ordre n est un arrangement des nombres de
un à n 2 dans une matrice carrée d’ordre n, avec chaque élément apparaissant exactement une
seule fois, tel que chaque ligne, chaque colonne et chaque diagonale principale a la même
somme.
a) Montrer que si une matrice carrée d’ordre n existe la somme en question doit être
égale à n(n 2  1) / 2 .
b) Concevoir un algorithme de recherche exhaustive pour générer tous les carrés
magiques d’ordre n.
c) Chercher sur Internet ou dans votre bibliothèque un algorithme meilleur pour générer
les carrés magiques.
d) Implémenter les deux algorithmes—la recherche exhaustive et celui que vous aurez
trouvé—et effectuer une expérience pour déterminer la plus grande valeur de n pour
laquelle chacun des algorithmes est capable de trouver un carré magique d’ordre n en
moins de une minute sur la machine que vous utilisez.

10
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

EXERCICES 4.1
Problème 1.
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.

Problème 2. Trouver l’ordre de croissance des solutions des récurrences suivantes :


a) T (n)  4T (n / 2)  n, T (1)  1
b) T (n)  4T (n / 2)  n 2 , T (1)  1
c) T (n)  4T (n / 2)  n3 , T (1)  1

Problème 3.
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 ?

EXERCICES 4.2
Problème 1. Appliquer le Quicksort pour trier la liste
E, X, A, M, P, L, E
par ordre alphabétique. Dessiner l’arbre des appels récursifs effectués.

Problème 2. Pour l’algorithme de partition présenté à la Section 4.2 :


a) Montrer que si les indices de balayage s’arrêtent pendant qu’ils pointent sur le même
élément, c’est-à-dire i = j, alors la valeur qu’ils pointent doit être égal à p.
b) Montrer que lorsque les indices de balayage s’arrêtent, j ne peut pas pointer sur un
élément plus d’une position à gauche de celui sur lequel pointe i.
c) Pourquoi est-il pire de stopper les balayages après avoir rencontré un élément égal au
pivot ?

Problème 3. Le tri rapide est-il un algorithme de tri stable ?


Problème 4. Donner un exemple de vecteur de n éléments pour lequel la sentinelle
mentionnée dans le texte est effectivement nécessaire. Quelle sera sa valeur ? Expliquer aussi
pourquoi une seule sentinelle suffit pour n’importe quel vecteur ?

Problème 5. Pour la version du Quicksort donnée dans le texte :

11
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

a) Les vecteurs ayant tous leurs égaux sont-ils les pires cas d’entrées, les meilleurs cas
d’entrées, ou rien des deux ?
b) Les vecteurs strictement décroissants sont-ils les pires cas d’entrées, les meilleurs cas
d’entrées, ou rien des deux ?

Problème 6.
a) Pour le Quicksort utilisant la sélection du pivot de la médiane des trois, les vecteurs
croissants sont-ils les pires cas d’entrées, les meilleurs cas d’entrées, ou non ?
b) Répondre à la même question pour les vecteurs décroissants.

Problème 7. Résoudre la relation de récurrence du cas moyen pour le Quicksort.

EXERCICES 4.3
Problème 1.
a) Quel est le nombre maximum de comparaisons clés effectuées par la recherche
dichotomique pour trouver une clé dans le vecteur suivant ?

3 14 27 31 39 42 55 70 74 81 85 93 98

b) Lister toutes les clés de ce vecteur qui vont nécessiter le plus grand nombre de
comparaisons clés quand ils sont cherchés par recherche dichotomique.
c) Trouver le moyen de comparaisons clés effectuées par la recherche binaire dans une
recherche positive dans ce vecteur. (On suppose que chaque clé est trouvée avec la
probabilité)
d) Trouver le moyen de comparaisons clés effectuées par la recherche binaire dans une
recherche négative dans ce vecteur.

Problème 2.
a) Démontrer l’égalité log2 n  1  log2 (n  1) , pour n  1.

b) Montrer que Cworst (n)  log2 n  1 vérifie la relation (4.2) pour tout entier positif
impair n.
Problème 3. Estimer combien de fois plus rapide une recherche positive moyenne sera dans
un vecteur trié de 100000 éléments si elle est effectuée par recherche binaire contre la
recherche séquentielle.

Problème 4. Ecrire un pseudocode pour la version récursive de la recherche binaire.

EXERCICES 4.4
Problème 1. Concevoir un algorithme diviser-pour-régner pour calculer le nombre de niveaux
d’un arbre binaire (En particulier, l’algorithme doit retourner 0 et 1 pour l’arbre vide et les
arbres ayant un seul nœud). Quelle est la classe d’efficacité de votre algorithme ?

12
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

Problème 2. L’algorithme suivant tente de calculer le nombre de feuilles d’un arbre binaire :
ALGORITHME LeafCounter(T)
//Calcule récursivement le nombre de feuilles d’un arbre binaire
//Input : Un arbre binaire T
//Output : Le nombre de feuilles de T
if T =  return 0
else return LeafCounter( TL ) + LeafCounter( TR )

Cet algorithme est-il correct ? Si oui, prouvez le ; si non, faire une correction appropriée.

Problème 3. 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.
Problème 4. 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é.

Problème 5. Parcourir l’arbre binaire suivant : a) en préordre, b) en inordre, c) en postordre

b c

d e f

EXERCICES 4.5

Problème 1. Quels sont le plus petit et le plus grand nombre de chiffres que le produit de
deux nombres entiers de deux chiffres peut avoir ?
Problème 2. Calculer 2101*1130 en appliquant l’algorithme du diviser-pour-régner présenté
dans le texte.
Problème 3.
a) Pourquoi nous n’avons pas inclus les multiplications par 10n dans le compte des
multiplications de l’algorithme de multiplication de grands entiers ?
b) En plus de supposer que n est une puissance de deux, nous avons fait, par souci de
simplicité, une autre hypothèse plus subtile en écrivant l’équation de récurrence pour
M(n), qui n’est pas toujours vraie. Quelle est cette hypothèse ?

13
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

EXERCICES 4.6
Problème 1.
a) Pour la version unidimensionnelle du problème de la paire la plus proche, concevoir
un algorithme directement basé sur la technique du diviser-pour-régner et déterminer
son efficacité.
b) Est-il un bon algorithme pour ce problème ?
Problème 2. Considérons la version diviser-pour-régner bidimensionnelle de l’algorithme de
la paire la plus proche dans laquelle on trie simplement chacun des deux ensembles C1 et C2
dans l’ordre croissant de leurs coordonnées y à chaque appel récursif. En supposant que la tri
est effectué par le tri fusion, écrire et résoudre la relation de récurrence du temps d’exécution
dans le pire cas pour n  2k .

Problème 3. Implémenter l’algorithme diviser-pour-régner de la paire la plus proche présenté


dans cette section, dans un langage de votre choix.

14
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

EXERCICE 5.1
Problème 1. Les fusiliers marins. Un détachement de n soldats doit traverser un fleuve large
et profond sans pont en vue. Ils voient deux garçons de douze ans jouer dans un bateau à
rames à côté du rivage. Le bateau est cependant si minuscule qu'il ne peut embraquer que
deux garçons ou un soldat. Comment les soldats peuvent-ils arriver à travers le fleuve et
laisser les deux garçons en possession de leur bateau? Combien de fois le bateau a-t-il besoin
de passages de rivage à rivage ?
Problème 2. Alterner les verres. On a 2n verres placés côte à côte dans une rangée, les n
premiers d’entre eux sont remplis de boisson, alors que les n verres restants sont vides. Faites
alterner les verres sous la forme rempli-vide-rempli-vide en effectuant un nombre minimum
de mouvements de verre.

Problème 3. Concevoir un algorithme basé sur le decrease-and-conquer pour générer


l’ensemble des parties d’un ensemble de n éléments.

Problème 4.
a) Quelle sentinelle pourrait-on placer avant le premier élément d’un vecteur à trier pour
éviter la vérification de la condition sur la borne inférieure j  0 à chaque itération de
la boucle interne du tri par insertion ?
b) La version avec sentinelle sera-t-elle dans la même classe d’efficacité que la version
originale ?
Problème 5. 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 ?

Problème 6. 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 ?
Problème 7. 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.

15
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

b) Montrer que le nombre de comparaisons clés dans le cas moyen du tri par insertion est
n2
donné par la formule C avg (n)  .
4
Problème 8. 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.

EXERCICES 5.4
Problème 1. Est-il réaliste d’implémenter un algorithme qui nécessite la génération de toutes
les permutations d’un ensemble de 25 éléments sur votre ordinateur ? Qu’en est-il de tous les
sous-ensembles d’un tel ensemble ?

Problème 2. Générer toutes les permutations de {1, 2, 3, 4} par


a) L’algorithme ascendant de minimum de changement
b) L’algorithme de Jonhson-Trotter
c) L’algorithme de l’ordre lexicographique

Problème 3. Ecrire un programme informatique pour générer les permutations dans l’ordre
lexicographique.

Problème 4. Considérons l’implémentation suivante de l’algorithme de génération des


permutations découvert par B. Heap [Hea63].
ALGORITHME HeapPermute(n)
//Implémente l’algorithme de Heap pour générer les permutations
//Input : Un entier positif n et un vecteur global A[1..n]
//Output : Toutes les permutations des éléments de A
if n = 1
write A
else
for i  1 to n do
HeapPermute(n – 1)
if n iso dd
swap(A[1], A[n])
else swap (A[i], A[n])

a) Exécuter manuellement l’algorithme pour n = 2, 3 et 4.


b) Prouver la correction de l’algorithme de Heap.
c) Quelle est l’efficacité temporelle de HeapPermute ?

Problème 5. Concevoir un algorithme decrease-and-conquer pour générer toutes les


combinaisons de k éléments choisis parmi n, c’est-à-dire tous les sous-ensembles de k
éléments d’un ensemble donné de n éléments. Votre algorithme est-il un algorithme avec un
minimum de changement ?
Problème 6. Code Gray et le Tour de Hanoi.

16
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

a) Montrer que les mouvements de disques dans l’algorithme récursif classique pour le
puzzle du Tour de Hanoi peut être utilisé pour générer le code Gray binaire reflété.
b) Montrer comment le code Gray binaire reflété peut être utilisé pour résoudre le puzzle
du Tour de Hanoi.

EXERCICES 5.5

Problème 1. Concevoir un algorithme devrease-by-half pour calculer log2 n et déterminer


son efficacité temporelle.

Problème 2. Considérons le tri ternaire—l’algorithme suivant pour la recherche dans un


vecteur trié A[0..n – 1 ]. Si n = 1, comparer simplement la clé de recherche K avec le seul
élément du vecteur ; sinon, chercher récursivement en comparant K avec An / 3 , et si K est
plus grand, comparer le avec A2n / 3 pour déterminer dans quel tiers du vecteur continuer
la recherche.
a) Sur quelle technique de conception cet algorithme est-il basé ?
b) Ecrire une équation de récurrence du nombre de comparaisons clés dans le pire cas.
(Vous pouvez supposer que n  3k ).
c) Résoudre la récurrence pour n  3k .
d) Comparer l’efficacité de cet algorithme avec celle de la recherche dichotomique.

Problème 3.

a) Ecrire un algorithme pour l’algorithme du divide-into-three pour le problème de la


fausse pièce de monnaie. (Assurez vous que votre traite correctement toutes les valeurs
de n, pas seulement celles qui sont des multiples de 3).
b) Ecrire une équation de récurrence du nombre de pesées dans l’algorithme du divide-
into-three pour le problème de la fausse pièce de monnaie et la résoudre si n  3k .
c) Pour des grandes valeurs de n, de combien fois environ cet algorithme est plus rapide
que celui basé sur la division des pièces de monnaies en deux piles ?

EXERCICES 5.6

Problème 1.
a) Si nous mesurons la taille d’un exemple du problème de calcul du plus grand diviseur
commun de m et n par la taille du deuxième paramètre n, de combien la taille diminue
après une itération de l’algorithme d’Euclide ?
b) Montrer que la taille d’une instance va toujours diminuer d’au moins par un facteur de
2 après deux itérations successives de l’algorithme d’Euclide.

Problème 2.
a) Appliquer l’algorithme basé sur la partition pour trouver la médiane de la liste de
nombres 9, 12, 5, 17, 20.
b) Montrer que l’efficacité au pire de l’algorithme basé sur la partition pour le problème
de la sélection est quadratique.

17
Université de Ngaoundéré Année Académique 2018/2019
Faculté des Sciences Licence 3
Département de Mathématiques et Informatique Semestre 5

TD Conception et Analyse des Algorithmes

Problème 3.
a) Ecrire un pseudocode pour une implémentation non récursive de l’algorithme basé sur
la partition pour le problème de sélection.
b) Ecrire un pseudocode pour une implémentation récursive de cet algorithme.

Problème 4. Dériver la formule qui sous-tend la recherche par interpolation.

Problème 5. Donner un exemple de pire cas d’entrée pour la recherche par interpolation et
montrer comment l’algorithme est linéaire dans le pire cas.

Problème 6.
a) Trouver la plus petite valeur de n pour laquelle log2 log2 n  1 est plus grand que 6.
b) Déterminer lesquelles des assertions suivantes sont vraies :
i) loglog n o(logn) ii) log log n  (log n)
iii) log log n  (log n)

Problème 7.
a) Ecrire un algorithme de recherche de la plus grande clé dans un arbre binaire de
recherche. Votre algorithme peut-il être classé comme un algorithme de diminution de
la taille de la variable ?
b) Quelle est la classe d’efficacité temporelle de votre algorithme dans le pire cas ?

Problème 8.
a) Ecrire un algorithme de suppression d’une clé dans un arbre binaire de recherche.
Votre algorithme peut-il être classé comme un algorithme de diminution de la taille de
la variable ?
b) Quelle est la classe d’efficacité temporelle de votre algorithme dans le pire cas ?

18

Vous aimerez peut-être aussi