L3 Informatique année 2014-2015 Méthodes Algorithmiques Examen du 16 Juin 2015 Responsable : Sophie Pinchinat Documents non autorisés Exercice 1 On considère l’algorithme suivant : Algorithm 1 XXX(A[1 . . . n] d’entiers, k entier, B[1 . . . n] d’entiers Require: k = max1≤i≤n A[i] 1: var C[0 . . . k] d’entiers 2: for i = 0 to k do 3: C[i] ← 0 4: end for 5: for j = 1 to longueur[A] do 6: C[A[j]] ← C[A[j]] + 1 7: end for 8: for i = 1 to k do 9: C[i] ← C[i] + C[i − 1] 10: end for 11: for j = longueur[A] to 1 do 12: B[C[A[j]] ← A[j] 13: C[A[j]] ← C[A[j]] − 1 14: end for 1) Exécuter l’Algorithme 1 pour les paramètres A = [2, 5, 3, 0, 2, 3, 0, 3] et k = 5, selon les trois étapes entre les lignes 5 − 7, 8 − 10, et 11 − 14, en ne faisant apparaı̂tre pour chacune des ces trois étapes que la valeur des tableaux C et B. Détailler toutefois les deux premières itérations de la boucle for de la ligne 11. 2) Quelle est la propriété vérifiée après l’exécution des lignes 5 − 7 ? 3) Quelle est la propriété vérifiée après l’exécution des lignes 8 − 10 ? 4) Que réalise l’Algorithme 1 ? 5) Quel serait l’effet de mettre for j = 1 to longueur[A] do à la ligne 11 ? 1 Exercice 2 Un serveur dans un restaurant a n clients attendant d’être servis. Chaque client a un numéro i compris entre 1 et n, et le temps requis pour servir chaque client est connu à l’avance : le client i requiert un temps de service ti . Par exemple, si on décide de servir les clients dans l’ordre de leur numéro, le temps d’attente Ai du client i (qui doit attendre que tous les clients précédents soient servis), vérifie les Équations (1) et (2) suivantes : Ai = Σij=1 tj (1) Ai = Ai−1 + ti (2) On cherche à minimiser le temps d’attente global A = Σni=1 Ai . 1) Dans quel ordre vous paraı̂t-il judicieux de servir les clients ? 2) En vous servant des Équations (1) et (2), montrez que cet ordre minimise A. 3) Déduisez-en un algorithme pour résoudre ce problème, ainsi que sa complexité. Exercice 3 Vous disposez de trois algorithmes pour résoudre un problème donné. • L’Algorithme a résoud le problème (de taille n) en résolvant récursivement 2 sousproblèmes de taille n − 1 et en recombinant les solutions en temps constant. • L’Algorithme b résoud le problème en le divisant en 5 sous-problèmes de taille moitié moindre, en résolvant ces sous-problèmes récursivement, et en recombinant les solutions en temps linéaire. • L’Algorithme c résoud le problème (de taille n) en le divisant en 9 sous-problèmes de taille n/3, en résolvant récursivement chaque sous-problème, et en recombinant les solutions en temps O(n2 ). 1) On note Tx (n) le temps de calcul de l’Algorithme x sur une entrée de taille n, donnez les équations qui décrivent Tx (n) pour chaque x ∈ {a, b, c}. 2) Quel est asymptotiquement le temps d’exécution de chaque algorithme ? 3) Bonus Lequel choisiriez-vous ? 2