Telechargé par Irfane Ousmane Maman

dm1-mai2020 université de Lille

publicité
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
Téléchargement