UHBC - Dept d'informatique 2012/2013
Master Ingénierie des Logiciels
Algorithmique Avancée et Complexité
_________________________________________________________
Corrigé d’examen
Exercice 1 : (6 pts)
1) On considère l'algorithme suivant:
Procédure Algo(Entrée n :Entier)
Début
Pour i :=1 à n Faire Algo1(n) Fait ;
Algo2(n) ;
Algo3(n) ;
Fin ;
Sachant que Algo1(n) s'effectue en temps O(log n), Algo2(n) en temps O(n) et Algo3(n) en temps O(n2),
quelle est la complexité de Algo(n)?
Réponse :
La boucle pour en O(nlogn), Algo2(n) en O(n) et Algo3(n) en O( n2) la complexité de Algo(n) est donc en
O(n2) ( la plus grande).
2) Soit la fonction récursive suivante :
Fonction F(entrée i, j: entier): entier;
Début
Si i=1 Alors F :=j ;
Sinon Si (i Mod 2)=1 Alors F := j+ F(i/2,j*2);
Sinon F := F(i/2,j*2);
Fsi ;
Fsi ;
Fin;
a. Calculer les résultats de cette fonction pour les valeurs suivantes : F(1,10)=10 ; F(2,10)=20 ;
F(3,10)=30 ; F(4,10)=40 ; F(6,10)=60 et F(10,10)=100.
L’opération réalisée par cette fonction est la multiplication de deux nombres entiers positifs.
b. La complexité algorithmique de F est en O(log2n) car à chaque itération on divise n/2 .
c. Cette fonction n’est pas récursive à droite car il y a un traitement après l’appel récursif (l’opération
d’addition)
d. Proposer une fonction itérative équivalente à F.
Avant de transformer cette fonction récursive en une fonction itérative, on propose la fct récursive à
droite suivante :
Fonction Fr(entrée i, j,a: entier): entier;
Début
Si i=1 Alors F :=a+j ;
Sinon Si (i Mod 2)=1 Alors F := F(i/2,j*2, a+j);
Sinon F := F(i/2,j*2,a);
Fsi ;
Fsi ;
Fin;
Cette fonction est récursive à droite, on peut facilement maintenant éliminer la récursivité.
Fonction Fit(entrée i, j :entier): entier;
Début
Var a : Entier ;
a :=0 ;
Tant que i<>1 faire
Si (i Mod 2)=1 Alors a := j+ a; Fsi,
i:= i/2,
j :=j*2;
Fait;
Fit :=a+j ;
Fin;
Exercice 2 : (3 pts)
Considérer l’arbre de jeu suivant:
La racine est le nœud max.
Donnez des valeurs (toutes différentes les unes aux autres) aux feuilles de sorte que l’algorithme MinMax
avec élagage α−β coupe au moins une feuille avec un parcours de gauche à droite de l’arbre.
Corrigé :
On donne les valeurs suivantes: a = 4, b = 8, c = 3, d = 2, e = 6 et f = 7. Dans un parcours gauche à droite
l’algorithme MinMax avec élagage α−β coupe la feuille d.
Exercice 3 : (6 pts)
Considérez la carte suivante avec des villes:
Les routes entre les villes peuvent contenir des parties montantes, descendantes et plates. Dans les parties
montantes on peut avancer à 60 km/h, dans les parties descendantes à 120 km/h et dans les parties plates à
90 km/h. Dans le tableau suivant sont indiqués pour chaque route, le nombre de kilomètres du chemin entre
deux villes par partie (montantes, descendantes, plates).
Chemin entre A et C A,I C,D C,F D,E E,J E,B F,E F,G G,B I,J J,B
Montante 20 50 10 20 0 0 20 0 50 0 0 10
Descendante 20 10 20 0 10 0 30 20 0 60 10 10
Plate 15 30 9 21 9 30 0 21 0 0 30 21
On veut trouver le chemin le plus court en temps (minutes) entre A et B. Pour cela on veut appliquer
l’algorithme A*. On dispose en plus de l’information suivante: Pour chaque ville X on connaît le chemin à
vol d’oiseau entre la ville X et B. Le tableau ci-dessous représente le temps de parcours estimé reliant toutes
les villes.
Indication : Calculer d’abord le temps (minutes) de parcours entre les villes. Sachant que:
la distance= Vitesse*Temps.
Corrigé :
On calcule d’abord le temps de parcours entre les villes
Application de l’algorithme A* sur le graphe :
Etape Choix Ouverts Fermés
Init {A(Nil,0,55)} {}
1 A(Nil,0,55) {C(A,40,79); I(A,75,91)} {A(Nil,0,55)}
2 C(A,40,79) {I(A,75,91), D(C,66,97); F(C,74,105)} {A(Nil,0,55) ; C(A,40,79)}
3 I(A,75,91) {D(C,66,97); F(C,74,105), J(I,100,116)} {A(Nil,0,55) ; C(A,40,79) ; I(A,75,91) }
4 D(C,66,97) {A(Nil,0,55) ; C(A,40,79) ; I(A,75,91)
D(C,66,97)}
5 E(D,77,97) { F(C,74,105), J(E,97,113) ; B (E,112,112); {A(Nil,0,55) ; C(A,40,79) ; I(A,75,91)
} D(C,66,97), E(D,77,97)}
6 F(C,74,105) { J(E,97,113) ; B (E,112,112); {A(Nil,0,55) ; C(A,40,79) ; I(A,75,91)
G(F,124,149), } D(C,66,97), E(D,77,97), F(C,74,105)}
7 B(E,112,112) { J(E,97,113) ; G(F,124,149), } {A(Nil,0,55) ; C(A,40,79) ; I(A,75,91)
(But) D(C,66,97), E(D,77,97), F(C,74,105),
B(E,112,112)}
Le chemin est : (A, C, D, E et B) dont le temps est = 112 minutes
Exercice 4 : (5 pts)
Soit W = {w1, w2, …, wn} une suite de nombres positifs et soit M un entier positif. On souhaite écrire un
algorithme qui utilise un maximum de nombres de W telles que ∑ ∗ ≤ avec xi= 0 ou 1. Par
exemple pour W = {18,23,12,5} et M = 35 ; une solution peut être la liste X= (1,0,1,1).
Proposez un algorithme glouton livrant une solution du problème. Quelle est sa complexité.
Corrigé :
Pour pouvoir utiliser un maximum de nombres, il faut donc trier W par ordre croissant, et commencer à
prendre les plus nombres d’abord.
Procédure Glouton ( Entrée W : tab, M : eniter, Sortie X : Tab));
Debut
Initialiser X(i) à 0 pour i :=1 à n ;
Trier (W) ;
I:=1 ; T:=0 ; Poursuite :=Vrai ;
Tant que i<=n et Poursuite
Faire Si T+w[i]<=M Alors T=T+w[i];
X(i):=1; i:=i+1;
Sinon Poursuite:=Faux;
Fsi ;
Fait;
Fin ;
La complexité de cet algorithme est calculée comme suit :
Au pire cas, la boucle tant que est répétée n fois ; et la complexité du tri est généralement de l’ordre de
O(n2). La complexité de cet algo est donc de l’ordre de O(n2).