Les deux plus proches, sans boucles imbriquées
Exercice · niveau 2 · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Parcours et boucles imbriquées
Énoncé
Chercher les deux valeurs les plus proches d'une liste par boucles imbriquées coûte comparaisons. Écrire une version qui trie d'abord la liste et ne compare que des voisins. Sur quelle propriété repose-t-elle ?
Corrigé
def plus_proches(L):
T = sorted(L) # sorted RENVOIE une copie triee
meilleure = T[1] - T[0]
couple = (T[0], T[1])
for i in range(len(T) - 1):
d = T[i+1] - T[i]
if d < meilleure:
meilleure = d
couple = (T[i], T[i+1])
return couple
La propriété. Dans une liste triée, deux valeurs réalisant l'écart minimal sont voisines. Démontrons-le : soient deux indices avec . La liste étant croissante, tous les écarts intermédiaires sont positifs, donc
La paire voisine fait donc au moins aussi bien que la paire . Il est inutile d'examiner autre chose que les paires voisines.
Le coût. La boucle fait soustractions ; c'est le tri qui domine, avec de l'ordre de opérations, contre pour les boucles imbriquées. Sur : environ opérations au lieu de , soit quelques millisecondes au lieu de plusieurs secondes.
Le point à retenir. On a payé un tri pour supprimer une boucle, et le marché est bon. Mais on perd l'ordre initial : pour rendre les indices d'origine et non les valeurs, il faudrait trier des couples (valeur, indice).
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.