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
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 7 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le podcast et la vidéo du chapitre : 2 minutes d'écoute sans compte
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.