Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 67

Stratégies Algorithmiques: Choisir la Bonne

Recommended resources

Bonjour !

Dans la leçon précédente, nous avons appris à choisir la bonne "boîte" pour ranger nos données, en sélectionnant la structure la plus adaptée (tableau, pile, file, etc.). Nous avons vu que ce choix est fondamental pour la logique et l'efficacité de notre algorithme.

Aujourd'hui, nous allons nous concentrer sur l'étape suivante : une fois les données bien organisées, quelle stratégie allons-nous appliquer pour les manipuler et résoudre le problème ? Cette leçon est au cœur de la pensée algorithmique. Vous apprendrez à reconnaître des familles de problèmes et à leur associer une stratégie de résolution pertinente parmi les plus grandes "recettes" de l'informatique : le parcours, le tri, la recherche, la récursivité et l'approche "Diviser pour Régner".

Savoir choisir la bonne stratégie est ce qui distingue un algorithme naïf d'un algorithme élégant et performant, un pas de géant vers votre objectif d'écrire du "code clean".

1. Les stratégies fondamentales : Parcours et Recherche

Face à un problème, la première idée, la plus simple, est souvent de regarder tous les éléments un par un. C'est la stratégie du parcours.

Le parcours simple (ou recherche linéaire)

Imaginez que vous cherchez un nom dans un annuaire téléphonique non trié. Vous n'avez pas d'autre choix que de lire chaque nom, du début à la fin, jusqu'à trouver celui que vous cherchez. C'est l'essence de la recherche par parcours, aussi appelée recherche linéaire.

  • Stratégie : Examiner chaque élément de la collection, l'un après l'autre.
  • Quand l'utiliser ? Quand les données ne sont pas triées, ou quand la collection est suffisamment petite pour que cette approche soit assez rapide.
  • Complexité : Dans le pire des cas, il faut parcourir tous les N éléments. On note cela O(N).

L'optimisation : la recherche dichotomique

Maintenant, imaginez que cet annuaire est trié par ordre alphabétique. Votre méthode de recherche change radicalement. Vous ouvrez le livre au milieu : si le nom que vous cherchez vient avant, vous ignorez toute la deuxième moitié du livre. Sinon, vous ignorez la première. Vous répétez ce processus, divisant à chaque étape le problème par deux. C'est la recherche dichotomique.

  • Stratégie : À chaque étape, couper l'espace de recherche en deux.
  • Quand l'utiliser ? Impérativement sur des données triées. C'est une stratégie extrêmement efficace pour la recherche.
  • Complexité : Le nombre d'étapes est très faible, même pour des millions d'éléments. On note cela O(log N).

Pour bien saisir la différence fondamentale entre ces deux approches, je vous propose de lire une section qui les compare directement.

[PDF] Écriture et comparaison des algorithmes, tris

Le document '[PDF] Écriture et comparaison des algorithmes, tris' explique très clairement ces deux stratégies de recherche. Concentrez-vous sur le principe et la différence de performance.

Rendez-vous à la section 2.1 'La recherche en table'. Lisez les deux sous-sections 'Recherche par parcours' (2.1.1) et 'Recherche dichotomique' (2.1.2). Notez bien la condition essentielle pour utiliser la recherche dichotomique.

Le choix entre ces deux stratégies dépend donc d'une question simple : les données sont-elles triées ? Si non, et que vous devez faire des recherches fréquentes, une autre stratégie s'impose en amont : le tri.


2. Le tri : une stratégie de préparation

Le tri est une famille d'algorithmes dont le but est d'organiser une collection d'éléments selon un certain ordre. C'est une stratégie en soi, mais c'est aussi souvent une étape de pré-traitement qui permet d'utiliser ensuite des stratégies beaucoup plus rapides, comme la recherche dichotomique.

Il existe de nombreuses "recettes" pour trier, des plus simples aux plus sophistiquées.

Comparaison Visuelle des Algorithmes de Tri : Insertion, Sélection et Bulle
Cette image illustre le fonctionnement de trois algorithmes de tri de base : par insertion, par sélection et à bulles. On voit comment, étape par étape, chaque algorithme réorganise les barres pour les ordonner. C'est une excellente visualisation de différentes stratégies pour un même problème.

Choisir le "bon" algorithme de tri est un problème de stratégie en lui-même. Le tableau suivant, tiré du même document, résume les caractéristiques des principaux algorithmes de tri.

[PDF] Écriture et comparaison des algorithmes, tris

Ce tableau récapitulatif est un outil précieux. Il compare les algorithmes de tri sur des critères essentiels comme leur vitesse moyenne, leur vitesse dans le pire des cas, et l'espace mémoire qu'ils utilisent.

Étudiez le tableau de la section 2.3.6, 'Tableau récapitulatif (tris par comparaison)'. Remarquez la différence entre les algorithmes en N² (bulle, sélection, insertion) et ceux, bien plus efficaces pour de grandes quantités de données, en N log N (rapide, fusion).

  • Stratégie : Organiser une collection de données.
  • Quand l'utiliser ?
    • Lorsque le résultat final doit être une liste ordonnée.
    • En tant qu'étape préparatoire pour permettre des recherches rapides et répétées.
  • Le choix de l'algorithme de tri dépend de la taille des données, de leur état initial (presque triées ou non), etc.

3. Diviser pour mieux régner : Récursivité et Diviser pour Régner

Certains problèmes semblent complexes, mais peuvent être simplifiés en les ramenant à une version plus petite d'eux-mêmes. C'est le principe de la récursivité.

Une fonction récursive est une fonction qui s'appelle elle-même, mais sur un problème de taille réduite. Pour qu'elle ne s'appelle pas indéfiniment, elle doit avoir un cas de base (une condition d'arrêt).

Une des applications les plus puissantes de la récursivité est la stratégie "Diviser pour Régner".

Principe Général du Diviser pour Régner
Ce schéma illustre parfaitement la stratégie : 1. **DIVISER** le problème global en sous-problèmes plus petits et indépendants. 2. **RÉGNER** en résolvant chaque sous-problème (souvent par un nouvel appel récursif). 3. **COMBINER** les sous-solutions pour obtenir la solution globale.

Les algorithmes de tri les plus performants, comme le tri fusion (merge sort) et le tri rapide (quick sort), sont des exemples parfaits de cette stratégie.

Pour comprendre ce principe en action, je vous propose d'explorer une ressource interactive dédiée.

Récursivité : une introduction et une collection d'algorithmes.

Cette page web, 'Récursivité : une introduction', est excellente pour visualiser ces concepts. Nous allons nous concentrer sur le tri fusion, l'exemple-type de la stratégie 'Diviser pour Régner'.

Lisez la section 'Tri par partition-fusion : un exemple de stratégie diviser pour régner'. Faites particulièrement attention au pseudo-code qui montre bien les trois étapes : les deux appels récursifs (Diviser/Régner) et la phase de 'fusionner' (Combiner).

  • Stratégie : Décomposer un problème en sous-problèmes indépendants, les résoudre, puis combiner leurs solutions.
  • Quand l'utiliser ? Quand un problème peut être naturellement scindé en plusieurs parties dont les solutions peuvent être fusionnées facilement. Le tri, la recherche de l'élément le plus proche, ou même le calcul de puissances (exponentiation rapide) sont des exemples classiques.

4. Comment choisir ? Un guide pratique

Face à un nouveau problème, voici une démarche pour vous orienter vers la bonne stratégie :

  1. Analysez le problème : Quelles sont les entrées ? Les sorties ? Les contraintes (taille des données, temps d'exécution) ? (C'est notre leçon 11.1)

  2. Structure des données : Quel est le meilleur contenant pour mes données ? (C'est notre leçon 11.2)

  3. Posez-vous les bonnes questions sur la stratégie :

    • Question 1 : Faut-il simplement traiter tous les éléments ?
      • Oui -> Parcours. C'est votre point de départ. Est-ce assez rapide ?
    • Question 2 : Le problème implique-t-il une recherche ? Les données sont-elles triées ?
      • Oui, triées -> Recherche dichotomique.
      • Non, pas triées, mais je vais chercher souvent -> Pensez à la stratégie combinée : Tri (une seule fois) puis Recherche dichotomique (plusieurs fois).
    • Question 3 : Puis-je définir la solution du problème en utilisant la solution d'une version plus petite du MÊME problème ?
      • Oui -> La récursivité est une voie à explorer. Par exemple, pour explorer un système de dossiers et sous-dossiers, la fonction explorer(dossier) appellera explorer(sous_dossier).
    • Question 4 : Le problème peut-il être coupé en morceaux indépendants, résolus séparément, puis ré-assemblés ?
      • Oui -> C'est un cas typique pour Diviser pour Régner.

5. À vous de jouer !

Pour chacun des scénarios suivants, choisissez la stratégie algorithmique la plus pertinente parmi celles que nous avons vues (Parcours, Recherche Dichotomique, Tri, Récursivité, Diviser pour Régner) et justifiez votre choix.

  1. Problème : Vous avez une liste de 1 million de transactions bancaires, triées par date. Vous devez trouver toutes les transactions effectuées un jour précis.
    • Votre choix et justification : ...
  2. Problème : Vous devez écrire une fonction qui calcule la somme de tous les nombres d'une liste non triée.
    • Votre choix et justification : ...
  3. Problème : On vous donne une boîte pleine de Lego de toutes les tailles, en vrac. Pour construire votre maison, vous avez besoin de les ranger du plus petit au plus grand.
    • Votre choix et justification : ...
  4. Problème : Vous devez développer une fonction qui renomme tous les fichiers d'un dossier et de tous ses sous-dossiers, peu importe la profondeur.
    • Votre choix et justification : ...
  5. Problème : Pour trier une immense base de données d'utilisateurs, vous décidez de la couper en deux, d'envoyer chaque moitié à un serveur différent pour qu'il la trie, puis de fusionner les deux listes triées.
    • Votre choix et justification : ...

Solutions :

  1. Recherche dichotomique. Les données sont nombreuses et surtout, elles sont déjà triées. On peut donc très rapidement trouver le début et la fin de la plage de dates correspondant au jour recherché.
  2. Parcours. Il faut additionner chaque élément. La seule façon de faire est de les visiter tous une fois, du début à la fin.
  3. Tri. Le problème est explicitement de "ranger du plus petit au plus grand", ce qui est la définition même du tri.
  4. Récursivité. La structure d'un dossier contenant des sous-dossiers est naturellement récursive. Pour traiter un dossier, on traite ses fichiers, puis on applique la même logique à chacun de ses sous-dossiers.
  5. Diviser pour Régner. La description du problème suit exactement les étapes de cette stratégie : on divise le problème (couper en deux), on résout les sous-problèmes (les serveurs trient chaque moitié), et on combine (fusionner les listes). C'est le principe du Tri Fusion.

Conclusion

Vous disposez maintenant d'une "boîte à outils" de stratégies algorithmiques. Savoir les identifier est une compétence clé. En pratique, beaucoup d'algorithmes complexes sont des combinaisons intelligentes de ces idées fondamentales.

Points clés à retenir :

  • Parcours : La base de tout, simple mais parfois lent.
  • Tri : Une stratégie essentielle pour organiser les données et permettre des opérations plus rapides par la suite.
  • Recherche dichotomique : La méthode ultra-rapide pour trouver un élément dans un ensemble trié.
  • Récursivité : Une manière de penser élégante pour les problèmes qui se contiennent eux-mêmes.
  • Diviser pour Régner : Une application majeure de la récursivité, souvent la clé des algorithmes les plus performants.

Dans la prochaine leçon, nous verrons comment nous assurer que l'algorithme que nous avons conçu (en choisissant une structure et une stratégie) est correct. Nous aborderons la conception de cas de test pour valider sa logique et traquer les erreurs.