Adloun

É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.