Adloun

NSI (terminale) · Chapitre 6 · Application directe du cours

Problème — Sous-tableau de somme maximale

Diviser pour régner · niveau 3 (difficile)

Énoncé

Problème — Sous-tableau de somme maximale.

Étant donné un tableau d'entiers (positifs ou négatifs), trouver la plus grande somme d'un sous-tableau contigu, par une approche « diviser pour régner ».

Corrigé

on coupe le tableau au milieu. La somme maximale est soit entièrement à gauche, soit entièrement à droite, soit à cheval sur le milieu. Ce dernier cas se calcule en partant du milieu vers la gauche puis vers la droite.


def somme_centre(tab, g, m, d):
    # meilleure somme finissant en m (cote gauche)
    s, gauche = 0, float("-inf")
    for k in range(m, g - 1, -1):
        s += tab[k]
        gauche = max(gauche, s)
    # meilleure somme commencant en m+1 (cote droit)
    s, droite = 0, float("-inf")
    for k in range(m + 1, d + 1):
        s += tab[k]
        droite = max(droite, s)
    return gauche + droite

def somme_max(tab, g, d):
    if g == d:                       # cas de base
        return tab[g]
    m = (g + d) // 2
    return max(somme_max(tab, g, m),
               somme_max(tab, m + 1, d),
               somme_centre(tab, g, m, d))

def sous_tableau_max(tab):
    return somme_max(tab, 0, len(tab) - 1)

La complexité est , contre pour l'approche naïve qui testerait tous les sous-tableaux. (L'algorithme de Kadane fait même , mais n'utilise pas le paradigme étudié ici.)

100 % gratuit

Essaie le suivant avec le tuteur

Faire l'exercice suivant avec le tuteur

Sans compte : le cours, le premier QCM, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →