algorithmique (école d'ingénieur) · Chapitre 11 · Exercice de TD
Sous-tableau de produit maximum
Programmes justes : logique de Hoare et invariants · niveau 3 (difficile)
Énoncé
On cherche le produit maximum d'un sous-tableau non vide d'un tableau d'entiers relatifs ().
- Sur , quel est ce produit ? Pourquoi l'invariant du sous-tableau de somme maximum, transposé au produit, ne suffit-il pas ?
- Renforcer l'invariant en conservant aussi le produit minimum d'un suffixe non vide. Écrire la progression.
- Écrire la fonction en et la tester contre un programme naïf en .
Corrigé
- Le produit maximum est . Les suffixes non vides de ont pour produits et : le meilleur est . Prolongé par , il donne , alors que le pire suffixe, , donne . Un suffixe de produit très négatif devient le meilleur dès qu'on le multiplie par un nombre négatif : connaître le seul meilleur suffixe ne suffit plus pour la progression.
nom : T
valeurs : 2 -3 -2 4 -1 0 5
vert : 0..3
zone : 0..3 produit 48
legende : le produit maximum : 2 × (-3) × (-2) × 4 = 48
nom : T
valeurs : 2 -3 -2 4 -1 0 5
griser : 2..6
pointeurs : k=2
zone : 0..1 pire : -6
zone : 1..1 meilleur : -3
legende : prolongés par -2 : le meilleur suffixe donne 6, le pire 12
- Invariant : « est le produit maximum d'un sous-tableau non vide du -préfixe ; et sont les produits maximum et minimum d'un suffixe non vide du -préfixe ». Un suffixe non vide du -préfixe est seul, ou un suffixe non vide du -préfixe prolongé par . Le produit par étant monotone (croissant si , décroissant sinon), les extrêmes sont atteints en ou en :
Initialisation : . -
static long produitMax(int[] T) { int n = T.length; // n ≥ 1
long smax = T[0], smin = T[0], pm = T[0]; int k = 1; // I(T[0],T[0],T[0],1)
while (k != n) { // I(pm,smax,smin,k) et k ≠ n
long x = T[k], a = smax * x, b = smin * x;
smax = Math.max(x, Math.max(a, b)); // meilleur suffixe non vide
smin = Math.min(x, Math.min(a, b)); // pire suffixe non vide
k = k + 1;
if (smax > pm) pm = smax; // I(pm,smax,smin,k)
} // I(pm,smax,smin,n)
return pm;
}
. Le programme Exercices11.java la compare à la version naïve sur tableaux aléatoires :
[2, -3, -2, 4, -1, 0, 5] : 48 (naif 48)
[-2, 3, -4] : 24 (naif 24)
[-1] : -1 (naif -1)
[0, -2, 0] : 0 (naif 0)
[2, 3, -2, 4] : 6 (naif 6)
20000 tableaux aleatoires : identiques100 % gratuit
La suite du chapitre est sur Adloun
- 12 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.