Écrire top k(table, colonne, k) qui rend les k plus grandes lignes…
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 6 — Traiter des données en tables · Trier, agréger, résumer
Énoncé
Écrire top_k(table, colonne, k) qui rend les plus grandes lignes sans trier toute la table. Le valider contre le tri, puis dire à partir de quelle taille le tri redevient préférable.
Corrigé
On répète fois la recherche du maximum du chapitre 7, en retirant à chaque fois l'élu.
def top_k(table, colonne, k):
"""Les k lignes de plus grande valeur, par ordre décroissant.
Précondition : 0 <= k ; si k > len(table), rend toute la table.
Postcondition : le résultat est décroissant sur la colonne.
"""
reste = list(table) # copie : on ne détruit pas la table
res = []
for _ in range(k):
if len(reste) == 0:
break
m = 0
for i in range(1, len(reste)):
if reste[i][colonne] > reste[m][colonne]:
m = i
res.append(reste.pop(m))
return res
[l["nom"] for l in top_k(eleves, "moyenne", 2)] # ['Sofia', 'Nour']
La validation. On compare à la voie évidente — trier puis découper — sur tables tirées au hasard, tailles et compris :
a = top_k(t, "v", k)
b = sorted(t, key=lambda l: l["v"], reverse=True)[:k]
assert [l["v"] for l in a] == [l["v"] for l in b]
cas passent.
Le coût, et le point de bascule. top_k fait parcours, soit environ comparaisons ; le tri en fait de l'ordre de . Pour :
L'écart se creuse : à , le tri fait cinq fois le travail. Mais l'avantage s'inverse dès que dépasse — soit pour . Le bon algorithme dépend de , pas seulement de .
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.