INF7440 — Conception et analyse des algorithmes Automne 2015 Devoir 3 (à remettre au plus tard le 27 novembre, à 16h00) (dans la chute du département d’informatique, située au PK-4150) Le devoir doit être rédigé individuellement et à l’ordinateur. Vous devez justifier chacune de vos réponses. La démarche ainsi que l’utilisation correcte de la notation mathématique seront évaluées. Tout retard entraı̂nera une pénalité de 20% par jour ouvrable. Question 1 2 3 Total Sur 40 70 40 150 Note 1. (40 points) Dans ce problème, nous nous intéressons au nombre minimal de processeurs nécessaires pour traiter un ensemble de n tâches, où n est un nombre naturel. On suppose qu’à tout moment, un processeur ne peut jamais traiter plus d’une tâche. Une tâche est représentée par un couple de réels (d, f ), où d indique le temps auquel débute la tâche et f le temps auquel elle se termine. Bien entendu, d ≤ f . L’ensemble de toutes les tâches est dénoté par T . On dit que deux tâches t = (d, f ) et t0 = (d0 , f 0 ) se chevauchent s’il existe un nombre réel x tel que d<x<f et d0 < x < f 0 . Soit p le nombre maximal de tâches dans T qui se chevauchent simultanément, c’està-dire qu’il existe des tâches ti = (di , fi ), pour i = 1, 2, . . . , p et un nombre x tels que di < x < fi pour i = 1, 2, . . . , p. Nous disons alors que p est la profondeur de l’ensemble de tâches T . Par exemple, si on a les tâches t1 = (0, 3), t2 = (1, 5), t3 = (2, 4) et t4 = (4, 6), alors la profondeur de l’ensemble de ces quatre tâches est 3, puisque les tâches t1 , t2 et t3 se chevauchent en x = 2.5 et il n’existe aucun nombre pour lequel les quatre tâches se chevauchent. (a) (20 points) Donnez un algorithme glouton simple qui, étant donnés un ensemble de tâches T et sa profondeur p, retourne une association (un mapping) indiquant, pour chaque tâche i = 1, 2, . . . , n, le processeur parmi 1, 2, . . . , p qui traitera la tâche. Indice : Il suffit d’abord de trier les tâches en ordre croissant de début de traitement. Ensuite, en parcourant les tâches une par une, on assigne n’importe quel processeur disponible pour traiter cette tâche. (b) (20 points) Démontrez que l’algorithme donné en (a) fonctionne toujours. Plus précisément, montrez qu’il existe toujours un processeur disponible à chaque fois qu’on l’assigne dans l’algorithme. Indice : Procédez par l’absurde, c’est-à-dire supposez qu’à un moment donné, aucun processeur n’est disponible, et montrez qu’il y a alors une contradiction. 1/3 INF7440 — Conception et analyse des algorithmes Automne 2015 2. (70 points) Soit w une chaı̂ne de caractères. L’image miroir de w, notée w, e est la chaı̂ne g = ogla. de caractères obtenue de w en inversant l’ordre de ses lettres. Par exemple, algo On dit que w est un palindrome si w = w. e (a) (20 points) En utilisant la programmation dynamique, décrivez un algorithme qui, étant donné une chaı̂ne w de longueur n, retourne la longueur d’un plus long palindrome apparaissant dans w. Par exemple, si w = frénésie, alors il retourne 3, qui est la longueur du palindrome éné. Votre algorithme doit avoir une complexité O(n2 ). Indice : Pour 1 ≤ i ≤ j ≤ n, soit ( vrai si w[i, j] est un palindrome; P (i, j) = faux sinon, où w[i, j] est la sous-chaı̂ne de w commençant à l’indice i et terminant à l’indice j (inclusivement). Vous devez justifier que votre algorithme est correct et expliquer pourquoi sa complexité est O(n2 ). (b) (20 points) Étendez l’algorithme présenté en (a) pour qu’il énumère tous les palindromes maximaux. Il n’est pas nécessaire de faire une analyse de complexité dans ce cas, mais l’efficacité de votre algorithme sera évaluée. (c) (30 points) Donnez une implémentation des algorithmes présentés en (a) et (b) dans votre langage favori parmi C, C++, Java et Python. N’oubliez pas d’ajouter des exemples d’entrées et de sorties qui montrent que votre algorithme fonctionne. 3. Soit G = (V, E) un graphe non orienté et U ⊆ V un sous-ensemble de sommets. On dit que U est un transversal de cycles de G si tout cycle c de G passe par au moins un sommets de U . En d’autres termes, si on supprime les sommets U du graphe G, alors le résultat est un graphe acyclique (c’est-à-dire sans cycle). On s’intéresse dans cette question au problème de décider s’il existe un transversal de cycles de taille k, où k est un entier positif. (a) (10 points) Pour chacun des deux graphes suivants, donnez un transversal de cycles de taille minimale. Justifiez brièvement. a1 a1 b1 a2 a0 b2 a2 b5 b3 a3 c1 b4 b0 b4 a3 2/3 b1 c0 c2 c4 b7 a0 b0 c3 b6 a4 b2 b3 b9 b8 a4 INF7440 — Conception et analyse des algorithmes Automne 2015 (b) (30 points) Étant donnés un graphe non orienté G et un entier positif k, démontrez que le problème de décider s’il existe un transversal de cycles de cardinalité k dans G est un problème NP-complet. Indice : Considérez une réduction du problème de décider s’il existe une couverture des arêtes par les sommets de taille k d’un graphe G0 au problème de décider s’il existe un transversal de cycles de taille k d’un graphe G. En particulier, les arêtes pour le problème de la couverture peuvent être en correspondance avec des cycles de longueur 3 pour le problème du transversal de cycles. 3/3