4-7 mai 2020 Licence Informatique - Semestre 4 ASD DM1 - durée de travail 0h45 - à rendre pour le 4 mai 2020 Consignes de rendu : Date : du lundi 4 mai 8h au jeudi 7 mai 2020 17h Lieu : à déposer sur le cours Moodle Format : le devoir doit être rédigé de manière manuscrite sur feuille (ayez une écriture appliquée) et l’ensemble des feuilles doivent être prises en photo (ou scan) et déposées sur Moodle (attention Moodle accepte au maximum 10 fichiers et au maximum 50Mo par rendu). Vous devez conserver votre copie de manière à pouvoir la produire sur demande. La clarté des explications et justifications sera un élément important pris en compte lors de la correction. C’est un travail individuel qui est demandé. INDIQUEZ : votre NOM, votre NUMERO DU GROUPE, votre NUMERO D’ETUDIANT et NUMEROTEZ VOS PAGES Exercice 1 : Calculer une médiane On se pose le problème de calculer une valeur médiane d’un tableau d’entiers positifs. On rappelle que si t est un tableau de taille n, m un élément du tableau t, on dit que m est médiane de t si abs(card(I1 )−card(I2 )) ≤ 1 où I1 = {i de [0, n−1] tel que t[i] ≤ m} et I2 = {i de [0, n−1] tel que t[i] ≥ m}. Par exemple, la médiane de : [ 1 9 7 2 3 2 1 1 5 4 ] est 3 car le tableau contient 6 valeurs inférieures ou égales à 3 (les valeurs 1,2,3,2,1,1) et 5 valeurs supérieures ou égales à 3 (les valeurs 9,7,3,5,4) Autre exemple, la médiane de : [ 3 9 7 2 3 2 1 1 5 4 ] est également 3 car le tableau contient 6 valeurs inférieures ou égales à 3 (les valeurs 3,2,3,2,1,1) et 6 valeurs supérieures ou égales à 3 (3,9,7,3,5,4). Dernier exemple, la médiane de : [ 3 9 7 2 3 2 1 1 3 4 ] est également 3 car le tableau contient 7 valeurs inférieures ou égales à 3 (les valeurs 3,2,3,2,1,1,3) et 6 valeurs supérieures ou égales à 3 (3,9,7,3,3,4). Les algorithmes demandés peuvent être écrits en Python ou en pseudocode (dans tous les cas les instructions doivent être claires). Si vous réutilisez des algorithmes vus en cours, TD, TP, vous devrez spécifier ceux-ci (entrée, sortie, complexité asymptotique en temps et en espace, mais inutile d’en écrire le code). 1 Q 1.1 Proposer un algorithme dont la complexité asymptotique en temps est Θ(n2 ) et dont la complexité asymptotique en espace est Θ(1). Q 1.2 Justifier la complexité en temps. Q 1.3 Justifier la complexité en espace. Q 1.4 Proposer un algorithme dont la complexité asymptotique en temps est O(n log n) et dont la complexité asymptotique en espace est Θ(1). Q 1.5 Justifier la complexité en temps. Q 1.6 Justifier la complexité en espace. Q 1.7 Proposer un algorithme dont la complexité asymptotique en espace est Θ(M ) où M est la valeur maximale du tableau t. Q 1.8 Justifier la complexité en espace. Q 1.9 Quelle est la complexité asymptotique en temps de votre algorithme ? Justifier. Voici maintenant une proposition de solution de Albert Gorithm qui s’est dit qu’il pourrait utiliser la fonction permettant de partitionner un tableau selon un pivot (fonction qu’il a vue lorsqu’il a implanté le Quicksort en TP). Il donne ici son implantation en Python 1 : def m edia ne_d e _ a l _ g o r i t h m ( t ): """ t : a list of int """ for i in range ( len ( t )): tt = copy . deepcopy ( t ) e1 , e2 = partitionner ( tt , cmp , i ) diff = len ( e1 ) - len ( e2 ) if -1 <= diff <= 1: return t [ i ] partitionner prend en entrée une liste tt d’entiers, une fonction de comparaison qui retourne -1, 0 ou 1, et un indice i donnant la position du pivot. Elle retourne deux listes e1 et e2 telles que tout élément de e1 est plus petit ou égal à tt[i] et tout élément de e2 est strictement plus grand que tt[i]. On suppose que partitionner est écrit efficacement. Q 1.10 Quelle est la complexité asymptotique en temps de son algorithme ? Justifier. Q 1.11 Quelle est la complexité asymptotique en espace de son algorithme ? Justifier. Q 1.12 Pourquoi son algorithme ne fonctionne-t-il pas toujours ? 1. On rappelle que deepcopy créer un nouveau tableau, et est en Θ(n) en temps et en espace. 2