Terminale · Algorithmique

Coûts en temps et en mémoire

Un programme plus rapide sur une petite liste peut devenir beaucoup moins adapté sur un million d’éléments. L’analyse de coût cherche à comprendre cette évolution avec la taille de l’entrée, en séparant les propriétés de l’algorithme des circonstances particulières d’une machine.

SofienAvec SofienIngénieur et enseignant en informatique
Dans ce chapitre

Un cap pour ce chapitre

Ce que vous saurez faire

  • Définir une taille et une opération comptée.
  • Comparer des ordres de croissance.
  • Analyser la mémoire et les hypothèses de structure.
Les bases utiles pour commencer

Dire ce que l’on compte

La taille peut être le nombre d’éléments d’une liste, de sommets et d’arêtes d’un graphe ou de caractères d’un texte. Un algorithme ne possède pas un coût « en n » tant que n n’est pas défini. L’opération étudiée doit aussi être précisée : comparaison de clés, accès à une case ou étape de boucle, par exemple.

Le temps mesuré en secondes dépend du matériel, de l’environnement et des données. Un modèle de comptage permet d’expliquer une tendance sans prédire directement un chronométrage. Deux implémentations du même ordre de croissance peuvent avoir des constantes très différentes.

Reconnaître quelques croissances

Un parcours complet de n éléments donne souvent un coût linéaire. Deux boucles parcourant chacune toute la liste peuvent donner un coût quadratique, si le corps s’exécute pour chaque paire. Diviser la zone de recherche par deux à chaque étape donne une progression logarithmique : on compte combien de divisions sont nécessaires pour atteindre une taille élémentaire.

Un tri fusion combine une quantité linéaire de travail à chaque niveau d’un découpage équilibré, d’où n log₂ n. Pour n=1024, log₂ n vaut dix, n log₂ n vaut 10 240 et n² vaut 1 048 576. Ces expressions sont des repères de croissance, pas toutes des nombres exacts de comparaisons.

Deux boucles successives de n tours donnent 2n opérations de corps, donc un coût linéaire. Deux boucles imbriquées de n tours donnent n×n opérations. Le nombre de mots for dans un programme ne suffit pas : dessinez les répétitions réellement effectuées et exprimez leur total.

Préciser meilleur cas, pire cas et structure

Une recherche séquentielle peut trouver sa cible dès la première case ou ne conclure qu’après n comparaisons. Une recherche dans un ABR dépend de sa hauteur : logarithmique si l’arbre reste suffisamment équilibré, linéaire dans une chaîne. Il faut donc associer le coût annoncé aux hypothèses qui le rendent vrai.

Parler du pire cas signifie majorer le travail pour toute entrée de la taille considérée selon le modèle. Une moyenne demanderait une hypothèse sur la distribution des entrées. On ne peut pas annoncer un cas moyen rigoureux uniquement à partir de quelques exemples choisis.

Compter aussi ce qui reste en mémoire

La mémoire d’entrée et la mémoire auxiliaire répondent à des questions différentes. Une fonction qui parcourt une liste avec deux variables supplémentaires peut utiliser une mémoire auxiliaire constante, même si la liste reçue grandit. Une fonction qui construit une copie de n éléments utilise une mémoire auxiliaire linéaire.

La récursion conserve les contextes actifs. Pour un arbre, le nombre total de nœuds visités peut être n tandis que la profondeur active vaut sa hauteur. Une table dynamique échange souvent davantage de mémoire contre moins de recalculs. Le bon choix dépend des contraintes et des résultats à conserver, pas d’une préférence systématique pour le moins de variables.

Exemple suivi : compter une boucle triangulaire

Considérons une boucle extérieure i de 0 à n-1 et une boucle intérieure j de 0 à i-1. Les nombres d’exécutions du corps intérieur sont 0,1,2,...,n-1. Leur somme vaut n(n-1)/2 : pour n=5, on compte dix passages. La moitié de n² reste de croissance quadratique ; on ne peut pas la qualifier de linéaire parce que la seconde boucle ne parcourt pas toujours toute la liste.

Cette formule peut compter les paires non ordonnées de positions distinctes : chaque paire est prise une seule fois avec j<i. Si le programme compare toutes les paires ordonnées, y compris une case avec elle-même, le total devient n². Les deux algorithmes ont le même ordre de croissance mais réalisent des tâches de comptage différentes. Une formule exacte exige de lire les bornes ; un ordre de grandeur gomme certaines constantes sans autoriser à ignorer le contrat.

Exemple suivi : doubler les données et distinguer les mémoires

Pour n=256, les repères log₂ n, n, n log₂ n et n² valent 8,256,2048,65536. En doublant à 512, ils deviennent 9,512,4608,262144. Le logarithme augmente de un, le linéaire double, le quadratique quadruple ; n log n est ici multiplié par 2,25. Dire que tout algorithme prend deux fois plus de temps sur deux fois plus de données serait donc injustifié, même dans un modèle simple.

Une recherche qui garde deux indices peut utiliser une mémoire auxiliaire constante. Si elle crée une nouvelle tranche à chaque réduction, elle ajoute des allocations à analyser. Une récursion qui garde tous les cadres en attente ajoute également de la mémoire, même si le source contient peu de noms. Enfin, compter un nombre d’entiers comme des cases de coût fixe est un modèle pédagogique : des entiers arbitrairement grands demanderaient une analyse en bits plus fine, hors de ces comparaisons usuelles.

À vous de faire varier les choses

Agrandissez les données et comparez les modèles

Choisissez une puissance de deux. Les valeurs sont des modèles de croissance, pas des mesures en secondes ni des comparaisons exactes d’un code particulier.

Lire le résultat de l’expérience initiale

n = 1 024.

Comparez l’effet d’un incrément de k : la taille double. Le logarithme augmente seulement de un.

ModèleValeur pour nValeur pour 2n
log₂ n1011
n10242048
n log₂ n1024022528
n²10485764194304

Les ordres de croissance expliquent la montée en charge ; les performances mesurées demandent en plus un contexte concret.

De la compréhension à l’autonomie

À vous de résoudre

Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.

Exercice 1 · Comprendre#

Définir une variable de taille

On analyse un parcours de graphe par listes d’adjacence. Pourquoi une unique lettre n non définie rend-elle l’annonce « coût linéaire » ambiguë ?

Indice 1

Deux quantités décrivent la taille du graphe.

Indice 2

Une liste de voisins peut être longue même avec peu de sommets.

Comprendre la correction

Il faut distinguer le nombre de sommets et le nombre d’arêtes. Le travail d’un parcours dépend généralement des deux, souvent sous la forme V+E. Dire linéaire sans définir la quantité mesurée ne permet pas de vérifier l’annonce.

Exercice 2 · Appliquer#

Doubler l’entrée

Dans les modèles n et n², par quel facteur le coût est-il multiplié quand n double ?

Indice 1

Remplacez n par 2n.

Indice 2

Développez (2n)².

Comprendre la correction

Le modèle linéaire est multiplié par deux. Le modèle quadratique est multiplié par quatre, car (2n)²=4n². Ce contraste devient très important lorsque la taille augmente plusieurs fois.

Exercice 3 · Analyser#

Corriger une affirmation sur l’ABR

Un élève affirme : « Une recherche dans tout ABR de mille nœuds prend environ dix comparaisons. » Quelle hypothèse manque ?

Indice 1

L’arbre peut-il être une chaîne ?

Indice 2

Le logarithme décrit une hauteur équilibrée.

Comprendre la correction

Il manque une condition de hauteur équilibrée. Un ABR construit par insertions triées peut former une chaîne de mille nœuds et demander mille comparaisons pour une clé à son extrémité. La propriété d’ordre seule ne garantit pas la forme.

Exercice 4 · Justifier#

Analyser une copie

Une fonction crée une nouvelle liste de n éléments puis la parcourt avec deux indices. Sa mémoire auxiliaire est-elle constante parce qu’elle n’utilise que trois noms de variables ?

Indice 1

Un nom peut référencer un objet de taille variable.

Indice 2

Comptez les données stockées, pas seulement les noms.

Comprendre la correction

Non. La liste supplémentaire contient n éléments et domine la mémoire auxiliaire, qui est linéaire. Les deux indices ajoutent seulement une quantité constante. Le nombre de noms dans le code ne mesure pas le volume des objets qu’ils désignent.

Exercice 5 · Problème de synthèse#

Problème : compter trois organisations

Trois programmes exécutent respectivement deux boucles successives de n tours, deux boucles imbriquées de n tours et une boucle triangulaire j<i. Donnez leurs comptes pour n=6 puis leurs formules. Les trois ont-ils le même ordre de croissance ?

Indice 1

Additionnez les boucles successives.

Indice 2

Pour la dernière, additionnez 0+1+2+3+4+5.

Comprendre la correction

Les comptes valent 12,36,15. Les formules sont 2n, n² et n(n-1)/2. La première est linéaire, les deux autres quadratiques. L’organisation de l’exécution, et pas le nombre de boucles écrites, explique la différence. Une borne variable peut réduire le compte exact sans changer l’ordre dominant.

Exercice 6 · Problème de synthèse#

Problème : interpréter une mesure

Deux programmes ont des modèles 20n et n² opérations. Comparez-les pour n=10,20,100. Trouvez le seuil d’égalité. Peut-on en déduire des secondes sans autre donnée ? Expliquez pourquoi le meilleur ordre asymptotique ne gagne pas sur toutes les petites entrées.

Indice 1

Résolvez 20n=n² avec n positif.

Indice 2

Les coefficients représentent aussi du travail.

Comprendre la correction

Les couples de comptes sont (200,100),(400,400),(2000,10000). L’égalité positive est à n=20. Le modèle quadratique est plus petit à n=10, mais le linéaire gagne au-delà du seuil. Les comptes ne sont pas des secondes sans coût concret des opérations. L’analyse de croissance guide les grandes tailles sans effacer les constantes ni le contexte de mesure.

Exercice 7 · Problème de synthèse#

Problème : examiner mémoire et profondeur

A calcule une somme avec un accumulateur ; B copie la liste avant le même calcul ; C utilise une récursion qui retire une valeur par appel sans copier l’entrée. Pour une liste de n valeurs, comparez leur temps et mémoire auxiliaire. Pourquoi la correction de C ne suffit-elle pas à garantir une exécution sur une très longue liste ?

Indice 1

B stocke n cases supplémentaires.

Indice 2

C conserve jusqu’à n cadres actifs dans le modèle.

Comprendre la correction

Les trois calculs ont un temps linéaire dans le modèle usuel, avec une copie supplémentaire pour B. A utilise une mémoire auxiliaire constante, B une mémoire linéaire et C une pile de profondeur linéaire. Même si C termine mathématiquement, l’environnement peut imposer une profondeur maximale de récursion. Les garanties de résultat et les limites pratiques de ressources sont distinctes.

Les erreurs qui méritent un détour

Transformer une expression de coût en secondes.
Il manque le coût concret des opérations et les conditions de mesure.
Compter uniquement les variables nommées.
Les objets et les contextes d’appels peuvent avoir une taille variable.

La fiche à garder

L’essentiel à retenir

  • Définissez la taille, l’opération et le cas étudié.
  • Une meilleure croissance devient décisive lorsque l’entrée augmente.
  • Le coût mémoire comprend les structures auxiliaires et la pile.

Cette notion au bac

Retrouvez ces idées dans un sujet complet, avec des indices, une correction expliquée et des ateliers.

Le prochain pas

Retrouver le catalogue de Terminale

Ce chapitre s’appuie sur le programme officiel de Terminale (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.