TD7. Structure de données
Le sujet de ce TD est disponible au format pdf ici.
Ce TD à pour objectif d'illustrer l'importance du choix d'une structure de données sur la complexité des algorithmes associés.
On cherche ici à analyser un ensemble de données très volumineux.
On dispose d'un tableau de plus d'un million de tuples contenant chacun une note et le nom d'un étudiant.
Chaque note est un entier entre 0
et 100
.
L'objectif est de répondre aux questions suivantes :
- Comment sélectionner aléatoirement un étudiant ayant une certaine note ?
- Quelle est la note moyenne ?
- Combien d'étudiants ont au moins une certaine note ?
- Qui est le
nième
étudiant en partant du plus faible ? - Quelle est la note médiane ?
Exercice 1 : conversion des données
Afin de pouvoir répondre à toutes ces questions de manière efficace, on se propose de stocker les données dans un tableau dynamique donnees
.
donnees
est indicé entre 0
et 100
(donc de longueur 101) et chaque case donnees[note]
contient elle-même un tableau de 2 cases :
donnees[note][0]
est le nombre total d'étudiants ayant une note strictement inférieure ànote
;donnees[note][1]
est un tableau dynamique des noms des étudiants dont la note est exactementnote
, trié par ordre alphabétique.
Question 1
Représenter donnees
de façon schématique sur papier puis écrire une fonction conversion
qui convertit le grand tableau d'origine en donnees
.
Question 2
Quelle est la complexité temporelle de l'algorithme de conversion ?
Correction question 2
Cliquez ici pour révéler la correction.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
|
Exercice 2 : analyse
Maintenant que notre structure de données est construite, nous pouvons réaliser les algorithmes d'analyse qui la parcourent.
Nous allons donc implémenter les opérations décrites dans l'introduction du TD en utilisant donnees
. Pour chacune des analyses, nous indiquerons quelle est la complexité temporelle et quelle est la complexité spatiale dans le pire cas.
Question 1
Écrire une fonction qui sélectionne aléatoirement un étudiant ayant une certaine note.
Question 2
Écrire une fonction qui calcule la note moyenne.
Question 3
Écrire une fonction qui calcule combien d'étudiants ont au moins une certaine note.
Question 4
Écrire une fonction qui récupère le nième
étudiant en partant du plus faible.
Question 5
Écrire une fonction qui calcule la note médiane. Il faut noter que celle-ci n’est pas nécessairement unique si le nombre d’étudiants est pair. En effet la médiane est définie comme un nombre tel que la moitié de la population est en-dessous au sens large (inférieur ou égal) et la moitié de la population est au-dessus au sens large. Si le nombre d’étudiants est pair, il peut s'agir de n’importe quel nombre situé entre les notes des deux étudiants du milieu. Nous utiliserons la plus petite médiane.
Correction globale
Cliquez ici pour révéler la correction.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
|
Exercice 3 : analyse++ (pour aller plus loin)
Question 1
Écrire une fonction qui calcule la note médiane en choisissant la médiane moyenne plutôt que la plus petite médiane si le nombre d'étudiants est pair.
Question 2
Modifier la fonction qui calcule la note moyenne afin de minimiser le nombre de multiplications.
Correction globale
Cliquez ici pour révéler la correction.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
|