Tutoriels d'utilisation
Comment exploiter chaque application pour réviser efficacement les algorithmes de référence.
📘 Tris
Cette application visualise les deux tris fondamentaux de référence : le tri par insertion et le tri fusion.
Vue d'ensemble de l'écran
L'écran est divisé en trois zones :
- Colonne de gauche : les paramètres (tableau à trier) et des exemples prédéfinis.
- Centre : la visualisation du tableau (barres) et, pour le tri fusion, les sous-listes intermédiaires
L1,L2,R. - Colonne de droite : le choix de l'algorithme, les boutons de navigation pas-à-pas, le pseudo-code synchronisé et les notes de complexité.
Comment l'utiliser
Tri par insertion
L'algorithme prend chaque élément à partir du deuxième et l'insère à sa place dans la partie triée (à gauche). Pour bien comprendre :
- Observe la barre orange : c'est l'élément en cours d'insertion (la "carte" qu'on tient en main).
- Les comparaisons décalent les éléments plus grands vers la droite jusqu'à trouver la bonne position.
- Complexité : O(n²) dans le pire cas, O(n) si déjà trié.
Tri fusion (merge sort)
L'algorithme utilise la stratégie "diviser pour régner" : il scinde la liste en deux, trie chaque moitié récursivement, puis fusionne les deux moitiés triées.
- Tu vois apparaître
L1etL2(les deux moitiés) puisR(le résultat fusionné). - L'interclassement compare en parallèle le premier élément de chaque liste et prend toujours le plus petit.
- Complexité : O(n log n) dans tous les cas. Meilleur que l'insertion pour les grands tableaux.
Points-clés à retenir
| Tri | Idée | Complexité | Stable ? |
|---|---|---|---|
| Insertion | Insérer un à un dans la partie triée | O(n²) | Oui |
| Fusion | Diviser, trier, fusionner | O(n log n) | Oui |
📘 Récursivité & Programmation dynamique
Cette application couvre les grands classiques de la récursivité et de la programmation dynamique : factorielle, exponentiation rapide, tours de Hanoï, Fibonacci (trois versions) et le rendu de monnaie.
Comment l'utiliser
L'interface est la même que les autres apps : paramètres à gauche, visualisation au centre, contrôles à droite.
Factorielle & exponentiation rapide
Deux algorithmes récursifs simples qui illustrent la pile d'appels.
- Factorielle :
fact(n) = n × fact(n-1). Complexité O(n). - Exponentiation rapide :
xn = (x²)n/2si n pair, sinonx · xn-1. Complexité O(log n) au lieu de O(n) pour la méthode naïve.
x=2, n=10. Tu verras qu'au lieu de 10 multiplications, l'algo n'en fait que 4 environ (log₂(10) ≈ 3,3).Tours de Hanoï
L'algorithme récursif classique : déplacer n disques d'une tour A vers une tour C en passant par B, avec la règle qu'on ne peut jamais poser un grand disque sur un petit.
- L'idée : pour déplacer n disques de A → C, on déplace d'abord (n-1) disques de A → B, puis le grand de A → C, puis (n-1) de B → C.
- Complexité : 2n - 1 déplacements (exponentielle).
Fibonacci : les trois versions
Le même problème, trois implémentations différentes pour illustrer la programmation dynamique.
- Naïf récursif :
fib(n) = fib(n-1) + fib(n-2). Très lent : O(φn). On voit l'arbre d'appels exploser en taille. - Mémoïsation (top-down) : on mémorise les résultats déjà calculés. O(n).
- Itératif (bottom-up) : on calcule du plus petit au plus grand. O(n), sans pile d'appels.
Rendu de monnaie
Problème : avec un système de pièces (par exemple {1, 2, 5, 10}), rendre une somme S en utilisant le minimum de pièces possible.
- Version DP : construit une table
M[0..S]oùM[k]= nombre minimal de pièces pour rendre k. Optimal en toutes circonstances. - Version gloutonne : prend toujours la plus grosse pièce possible. Plus simple, plus rapide, mais peut être sous-optimale selon le système de pièces.
📘 Algorithmes de recherche & Hachage
Cette application couvre les algorithmes de recherche dans un tableau (séquentielle, dichotomique, interpolation), les tables de hachage avec chaînage, et la recherche de motif dans une chaîne (naïve et Rabin-Karp).
Recherche dans un tableau
| Algorithme | Hypothèse | Complexité |
|---|---|---|
| Séquentielle | Tableau quelconque | O(n) |
| Dichotomique | Tableau trié | O(log n) |
| Interpolation | Tableau trié et distribution uniforme | O(log log n) en moyenne |
Recherche dichotomique
L'algorithme phare : à chaque étape, on regarde l'élément au milieu et on élimine la moitié du tableau où la cible ne peut pas être.
- Les bornes
g(gauche) etd(droite) sont affichées en bleu. - L'élément du milieu
mest surligné. S'il est égal à la cible, c'est trouvé. Sinon, on déplace une borne.
Interpolation
Une amélioration de la dichotomie : au lieu de toujours prendre le milieu, on estime la position attendue de la cible en fonction des valeurs aux bornes (comme chercher un mot dans un dictionnaire — on n'ouvre pas pile au milieu).
Table de hachage avec chaînage
Une structure qui permet d'insérer et rechercher en O(1) en moyenne. Chaque clé est transformée par une fonction de hachage en un indice de tableau ; les collisions sont gérées par une liste chaînée à chaque case.
- L'application montre la fonction de hachage utilisée (par défaut :
clé mod m). - Les collisions sont visibles : plusieurs clés tombent dans la même case et sont chaînées.
Recherche de motif
Trouver une chaîne P de longueur m dans un texte T de longueur n.
- Algorithme naïf : on essaie toutes les positions de départ. O(n·m) au pire.
- Rabin-Karp : on compare des empreintes de hachage au lieu de comparer caractère par caractère. O(n+m) en moyenne.
📘 Arbres binaires & Tas
Cette application visualise les parcours d'arbre (infixe, préfixe, postfixe, en largeur), les arbres binaires de recherche (ABR), les tas (heaps) et le tri par tas.
Définitions essentielles
- ABR (Arbre Binaire de Recherche) : arbre binaire dans lequel, pour chaque nœud, toutes les clés du sous-arbre gauche sont strictement plus petites et toutes celles du sous-arbre droit sont plus grandes (ou égales).
- Tas (heap) min : arbre binaire parfait (rempli niveau par niveau, de gauche à droite) où la clé de chaque nœud est ≤ aux clés de ses enfants. La racine contient donc toujours le minimum.
- Représentation tableau du tas : le nœud d'indice
ia ses enfants en2i+1et2i+2.
Parcours d'arbre
Quatre façons de visiter tous les nœuds d'un arbre :
- Infixe (gauche → racine → droite) : pour un ABR, donne les clés en ordre croissant.
- Préfixe (racine → gauche → droite) : utile pour cloner ou sérialiser un arbre.
- Postfixe (gauche → droite → racine) : utile pour libérer la mémoire (les fils avant le parent).
- Largeur (BFS) : visite niveau par niveau, utilise une file FIFO.
ABR : insertion et recherche
- Insertion : à chaque nœud, on compare ; si plus petit on va à gauche, sinon à droite. Le nouveau nœud devient toujours une feuille. O(h) où h = hauteur.
- Recherche : même logique, on élimine la moitié du sous-arbre à chaque comparaison.
Tas : insertion, suppression du min, tri par tas
L'opération clé du tas est la percolation.
- Insertion (percolation ↑) : on ajoute la nouvelle clé comme feuille à la fin, puis on la fait remonter tant qu'elle est plus petite que son parent.
- Suppression du min (percolation ↓) : on retire la racine, on met la dernière feuille à la place, puis on la fait descendre tant qu'elle est plus grande que son plus petit enfant.
- Tri par tas : phase 1, on construit le tas (n insertions). Phase 2, on extrait le min n fois. Complexité O(n log n).
- Orange pointillé fin = chemin prévu que va parcourir la valeur (annoncé dès l'ajout de la feuille).
- Rouge pointillé épais = échange en cours.
📘 Graphes
L'application la plus riche : elle couvre les parcours de graphes (BFS, DFS), les composantes connexes, le tri topologique, l'algorithme de Kosaraju (composantes fortement connexes), la détection de cycle, les plus courts chemins (Dijkstra, Bellman-Ford) et les arbres couvrants de poids minimum (Prim, Kruskal).
Comment construire un graphe
A B (non pondéré), A B w (pondéré) ou A B 3 → (orienté).
Tu peux zoomer sur le graphe avec la molette et déplacer la vue à la souris.
Parcours : BFS et DFS
- BFS (parcours en largeur) : utilise une file FIFO, visite niveau par niveau. Calcule la distance non-pondérée depuis la source.
- DFS (parcours en profondeur) : récursif, va le plus loin possible avant de remonter. Visualisation avec arêtes de retour récursif en pointillés orange.
Composantes connexes & tri topologique
- Composantes connexes (graphe non orienté) : on lance un DFS depuis chaque sommet non visité ; chaque DFS forme une composante.
- Tri topologique (graphe orienté acyclique) : on ordonne les sommets de telle sorte que pour toute arête u → v, u apparaisse avant v. Méthode : DFS + ordre postfixe inversé.
- Kosaraju : trouve les composantes fortement connexes en deux DFS (un sur G, un sur G transposé).
Plus courts chemins
| Algorithme | Type d'arêtes | Complexité |
|---|---|---|
| Dijkstra | Poids ≥ 0 uniquement | O((n+m) log n) |
| Bellman-Ford | Poids négatifs autorisés (sans cycle négatif) | O(n·m) |
- Dijkstra : choisit à chaque étape le sommet non visité de plus petite distance, puis relâche ses voisins. Visualisé avec un tableau d'évolution des distances.
- Bellman-Ford : relâche toutes les arêtes
n-1fois. Plus lent mais accepte les poids négatifs et détecte les cycles négatifs.
ACPM (Arbre Couvrant de Poids Minimum)
- Prim : commence par un sommet, ajoute à chaque étape l'arête de poids minimum reliant un sommet "dedans" à un sommet "dehors". Similaire à Dijkstra dans l'esprit.
- Kruskal : trie toutes les arêtes par poids croissant, ajoute chaque arête sauf si elle crée un cycle. Utilise la structure Union-Find pour détecter les cycles efficacement.
Détection de cycle
Pour un graphe orienté, un cycle existe si pendant un DFS on rencontre une arête vers un nœud actuellement en cours de traitement (arête arrière). L'application matérialise cela en surlignant les nœuds dans la pile d'appels.
Tableau récapitulatif
| Catégorie | Algorithmes |
|---|---|
| Parcours | BFS, DFS |
| Connexité | Composantes, Kosaraju, tri topo, cycle |
| Plus courts chemins | Dijkstra, Bellman-Ford |
| ACPM | Prim, Kruskal |